gpt4 book ai didi

c# - List.All(e => e.MoveNext()) 不会移动我的枚举数

转载 作者:IT王子 更新时间:2023-10-29 04:53:43 26 4
gpt4 key购买 nike

我正试图找出我们代码中的错误。我把它归结为下面的片段。在下面的示例中,我有一个 int 网格(行列表),但我想找到具有 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() always 返回 true,Currentalways 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++;
}
}

那么这只是 List 的问题吗?

最佳答案

因为List<T>的枚举数是 structArray 的枚举器是 class .

所以当你调用Enumerable.All使用该结构,制作枚举器的副本并将其作为参数传递给 Func因为结构是按值复制的。所以e.MoveNext在副本上调用,而不是在原件上调用。

试试这个:

Console.WriteLine(new List<int>().GetEnumerator().GetType().IsValueType);
Console.WriteLine(new int[]{}.GetEnumerator().GetType().IsValueType);

它打印:

True
False

关于c# - List<IEnumerator>.All(e => e.MoveNext()) 不会移动我的枚举数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23537567/

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