List <IEnumerator> .All (e => e.MoveNext ()) не переносит мои перечислители

Я пытаюсь отследить ошибку в нашем коде. Я сварил это к фрагменту ниже. В приведенном ниже примере у меня есть сетка целых (список строк), но я хочу найти индексы столбцов, которые имеют 1. Реализация этого состоит в том, чтобы создать перечислитель для каждой строки и пройти по каждому столбцу в включите счетчики в шаге.

class Program
{
    static void Main(string[] args)
    {
        var ints = new List<List<int>> {
            new List<int> {0, 0, 1},    // This row has a 1 at index 2
            new List<int> {0, 1, 0},    // This row has a 1 at index 1
            new List<int> {0, 0, 1}     // This row also has a 1 at index 2
        };
        var result = IndexesWhereThereIsOneInTheColumn(ints);

        Console.WriteLine(string.Join(", ", result)); // Expected: "1, 2"
        Console.ReadKey();
    }


    private static IEnumerable<int> IndexesWhereThereIsOneInTheColumn(
        IEnumerable<List<int>> myIntsGrid)
    {
        var enumerators = myIntsGrid.Select(c => c.GetEnumerator()).ToList();

        short i = 0;
        while (enumerators.All(e => e.MoveNext())) {
            if (enumerators.Any(e => e.Current == 1))
                yield return i;
            i++;

            if (i > 1000)
                throw new Exception("You have gone too far!!!");
        }
    }

}

Однако я заметил, чтоMoveNext() не запоминается каждый раз вокругwhile петля.MoveNext() всегда возвращает истину, иCurrent являетсявсегда 0. Является ли это целенаправленной функцией Linq, чтобы сделать ее более свободной от побочных эффектов?

Я заметил, что это работает:

    private static IEnumerable<int> IndexesWhereThereIsOneInTheColumn(
        IEnumerable<List<int>> myIntsGrid)
    {
        var enumerators = myIntsGrid.Select(c => 
            c.ToArray().GetEnumerator()).ToList(); // added ToArray() 

        short i = 0;
        while (enumerators.All(e => e.MoveNext())) {
            if (enumerators.Any(e => (int)e.Current == 1)) // added cast to int
                yield return i;
            i++;
        }
    }

Так это просто проблема со списком?

Ответы на вопрос(6)

Ваш ответ на вопрос