需要解释我丢失的代码输出

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()本书前一个例子中使用的方法中的代码,但它没有打印出来.如果有人能解释我为什么我会感激,欢呼和感谢提前!

Jon*_*eet 6

你调用GetEnumeratorelse块,但是这不会自动产生任何东西.如果你有类似的东西会很好:

// 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[]并修改数组.然而,这可能是一个不需要知道的细微差别.