gpt4 book ai didi

c# - 需要有关我缺少的代码输出的说明

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:06 25 4
gpt4 key购买 nike

我目前正在学习C#,需要解释。对于经验丰富的人来说,这可能合乎逻辑且简单,但是我认为代码应该以这种方式工作,但事实并非如此。

我正在尝试使用命名迭代器通过foreach循环在我的Car类中的carArray类中的所有Garage对象中打印所有GetTheCars对象,但是当我将错误的值传递给GetEnumerator()方法并输入else块内部时,什么也没发生。反向打印数组效果很好。这是代码。

主要方法:

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);
}
}


车库类:

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();
}
}


在else语句内的书示例中,编写与 GetEnumerator()方法相同的代码:

图书代码差异:

else
{
foreach (Car c in carArray)
{
yield return c;
}
}


我以为我可以重用本书前面示例中使用的 方法中的代码,但它什么也没打印出来。如果有人可以向我解释为什么我将不胜感激,请先加油并感谢!

最佳答案

您在GetEnumerator块中调用else,但这不会自动产生任何结果。如果可以有以下内容,那就太好了:

// This doesn't actually work!
yield all carArray;


...但是C#中没有这样的构造。您可以使用:

else
{
using (var iterator in GetEnumerator())
{
while (iterator.MoveNext())
{
yield return iterator.Current;
}
}
}


或跳过 GetEnumerator

else
{
foreach (var var in carArray)
{
yield return car;
}
}


...但是显然那很丑。

您可以做的是将代码分开,以便在需要自定义排序时仅使用迭代器块(带有 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];
}
}


如果您不要求颠倒的顺序,则直接返回数组引用确实有一个缺点。调用者可以将其转换为 Car[]并修改数组。但是,这可能是一个细微差别,现在还不需要知道。

关于c# - 需要有关我缺少的代码输出的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22200884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com