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++;
}
}
Так это просто проблема со списком?