msm*_*cic 1 .net c# collections foreach
我目前正在学习C#的过程,我需要一个解释.对于经验丰富的人来说,这可能是合乎逻辑且简单的,但我认为代码应该以这种方式工作而不是.
我想打印出所有Car内部的对象carArray在我的Garage类的foreach使用命名迭代循环,但是当我通过假值GetTheCars法和其他块进入里面,没有任何反应.反向打印阵列工作正常.这是代码..
主要方法:
static void Main(string[] args)
{
Garage carLot = new Garage();
foreach (Car c in carLot.GetTheCars(false))
{
Console.WriteLine("{0} is going {1} MPH", c.PetName, c.CurrentSpeed);
}
Console.WriteLine();
foreach (Car c in carLot.GetTheCars(true))
{
Console.WriteLine("{0} is going {1} MPH", c.PetName, c.CurrentSpeed);
}
}
Run Code Online (Sandbox Code Playgroud)
车库类:
class Garage : IEnumerable
{
private Car[] carArray = new Car[4];
public Garage()
{
carArray[0] = new Car("Rusty", 30);
carArray[1] = new Car("Clunker", 55);
carArray[2] = new Car("Zippy", 30);
carArray[3] = new Car("Fred", 30);
}
public IEnumerator GetEnumerator()
{
foreach (Car c in carArray)
{
yield return c;
}
}
public IEnumerable GetTheCars(bool ReturnReversed)
{
if (ReturnReversed)
{
for (int i = carArray.Length; i != 0; i--)
{
yield return carArray[i-1];
}
}
else
{
GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
在else语句中的book示例中,相同的代码编写GetEnumerator()方法如下:
书籍代码差异:
else
{
foreach (Car c in carArray)
{
yield return c;
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我可以重用GetEnumerator()本书前一个例子中使用的方法中的代码,但它没有打印出来.如果有人能解释我为什么我会感激,欢呼和感谢提前!
你调用GetEnumerator的else块,但是这不会自动产生任何东西.如果你有类似的东西会很好:
// This doesn't actually work!
yield all carArray;
Run Code Online (Sandbox Code Playgroud)
......但是C#中没有这样的结构.你可以使用:
else
{
using (var iterator in GetEnumerator())
{
while (iterator.MoveNext())
{
yield return iterator.Current;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或跳过GetEnumerator:
else
{
foreach (var var in carArray)
{
yield return car;
}
}
Run Code Online (Sandbox Code Playgroud)
......但显然这很难看.
您可以做的是分离代码,以便yield return在需要自定义排序时只使用迭代器块(带语句的方法):
// Made return type generic, and improved the name
public IEnumerable<Car> GetTheCars(bool reverseOrder)
{
return reverseOrder ? GetTheCarsReversed() : carArray;
}
private IEnumerable<Car> GetTheCarsReversed()
{
for (int i = carArray.Length; i != 0; i--)
{
yield return carArray[i - 1];
}
}
Run Code Online (Sandbox Code Playgroud)
如果您没有要求反转顺序,那么在直接返回数组引用方面确实存在缺点......然后调用者可以转换Car[]并修改数组.然而,这可能是一个不需要知道的细微差别.
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |