C# Count和foreach产生不同的结果

C# Count和foreach产生不同的结果,c#,linq,C#,Linq,我一直在使用一种方法将集合拆分为批次,答案如下-: 这是如何工作的,是修复它的一种方法?您的TakeIEnumerator方法取决于枚举器(源代码)的位置,因此取决于时间。。。靠自己。如果通过先整理“外部”结果来迭代结果,即 var batches=source.Batch(24.ToList(); //然后以任何方式迭代 然后根据定义,source已耗尽,您将在批中获得N个项目,其中N是source中的数字,所有批都将为空,因为没有更多数据。但是,如果结果是深度优先迭代的,即 foreach

我一直在使用一种方法将集合拆分为批次,答案如下-:


这是如何工作的,是修复它的一种方法?

您的
TakeIEnumerator
方法取决于枚举器(
源代码)的位置,因此取决于时间。。。靠自己。如果通过先整理“外部”结果来迭代结果,即

var batches=source.Batch(24.ToList();
//然后以任何方式迭代
然后根据定义,
source
已耗尽,您将在
批中获得N个项目,其中
N
source
中的数字,所有批都将为空,因为没有更多数据。但是,如果结果是深度优先迭代的,即

foreach(源代码中的var批处理){
foreach(批处理中的var项){…}
}
然后您将看到打开的光标。归根结底,这种方法本身就是脆弱和危险的。在我看来,批处理方法应该创建计算数据的缓冲区,可能是
列表
或类似的缓冲区。这将分配,但:它将是可靠的。例如:

私有静态IEnumerable TakeIEnumerator(IEnumerator源代码,int-size){
var buffer=新列表(大小);
int i=0;
do buffer.Add(source.Current);
而(++i
尝试在变量中保存
集合。批处理(2)
,并对其进行计数,而不是再次批处理同一集合。批处理同一集合或2“在不同的变量中输入时间,并查看
GetEnumerator
是否返回已完成的时间。我不明白为什么它不能用肉眼编辑。所以我只是抛出我能想到的最随机的东西,然后从那里开始。在我得到
未处理的异常时多次批处理同一个集合。System.InvalidOperationException:枚举已完成。
如果您将新的int数组初始化为更具揭示性的值(1到10为宜),然后打印出这些批的内容,可能会有所帮助。目前,您可能会得到10批10个,或者10批1个可枚举的,您永远不会知道。@Charlie,@devcrp
collection
不是这里的问题,问题中的代码只是为了演示。正如MarkGravell在他的回答中指出的,问题在于首先迭代外部枚举。
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size) {
    using (IEnumerator<T> enumerator = source.GetEnumerator())
        while (enumerator.MoveNext())
            yield return TakeIEnumerator(enumerator, size);
}

private static IEnumerable<T> TakeIEnumerator<T>(IEnumerator<T> source, int size) {
    int i = 0;
    do yield return source.Current;
    while (++i < size && source.MoveNext());
}
var collection = new int[10];
var count = 0;
foreach(var batch in collection.Batch(2))
    ++count;
Assert.AreEqual(5, count); // Passes
// But
Assert.AreEqual(5, collection.Batch(2).Count());        // Fails
Assert.AreEqual(5, collection.Batch(2).ToList().Count); // Fails