我有以下内容:
IEnumerable<string> lines // passed into method
foreach (var data in lines.ParseAsEnumberable(Delimiter, StringQualifer))
{
...
}
这对于这个特定的 foreach 循环来说很好。但是我想再过一遍,但是如果我再次使用类似的循环,就会得到一个“可能的多重枚举”警告,果然,第二次没有枚举结果。
我如何第二次通过这些线?
IEnumerable<T>
的问题在general case它不是consistent,例如什么时候
我们从外部源(文件、RDBMS 表、端口等)读取
IEnumerable<string> lines = File
.ReadLines(@"c:\...")
...
第二次枚举lines
时可以有
不同的数据(文件,表可以改变)。 为避免这种情况,您可以具体化枚举:
// Materialization if required:
// let's avoid overhead if lines is already a collection
// From now on source is a collection; it doesn't change between loops
var source = lines as IReadOnlyCollection<string> ?? lines.ToList();
...
// 1st loop
foreach(var data in source.ParseAsEnumberable(Delimiter, StringQualifer)) {
...
}
...
// 2nd loop over the very same collection
foreach(var item in source) {
...
}