如何再次枚举 IEnumerable?

问题描述 投票:0回答:1

我有以下内容:

IEnumerable<string> lines // passed into method

foreach (var data in lines.ParseAsEnumberable(Delimiter, StringQualifer))
{
...
}

这对于这个特定的 foreach 循环来说很好。但是我想再过一遍,但是如果我再次使用类似的循环,就会得到一个“可能的多重枚举”警告,果然,第二次没有枚举结果。

我如何第二次通过这些线?

c# ienumerable
1个回答
2
投票

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) {
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.