Я пытаюсь отследить ошибку в нашем коде. Я свел это к фрагменту ниже. В приведенном ниже примере у меня есть сетка целых чисел (список строк), но я хочу найти индексы столбцов, которые имеют 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()
всегда возвращает true, а 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++;
}
}
Так это просто проблема со списком?
foreach
? - person Rik   schedule 08.05.2014foreach
. В моей первой попытке было дваbreak
, и я думаю, что реализация Linq чище. - person Jonny   schedule 08.05.2014