Fre*_*örk 132

每个人都会定期做:

foreach (var item in collection)
{
    // do your stuff   
}
Run Code Online (Sandbox Code Playgroud)

  • @SharpC:最简单的方法是将结果提取到 List<T> 或数组中,然后将其传递到需要迭代它的各个位置。这保证了结果的(可能昂贵的)枚举仅发生一次,但代价是将结果存储在内存中。我的第一步是查明多重枚举是否确实是一个问题。 (2认同)

Nol*_*rin 84

除了已经建议的使用foreach循环的方法之外,我想我还要提到任何实现的对象IEnumerableIEnumerator通过该GetEnumerator方法提供了一个接口.虽然这种方法通常不是必需的,但是这可以用于手动迭代集合,在为集合编写自己的扩展方法时特别有用.

IEnumerable<T> mySequence;
using (var sequenceEnum = mySequence.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        // Do something with sequenceEnum.Current.
    }
}
Run Code Online (Sandbox Code Playgroud)

一个主要的例子是当你想要同时迭代两个序列时,循环是不可能的foreach.

  • 不要忘记处置普查员. (5认同)

Ale*_*ian 47

甚至是一种非常经典的旧时尚方法

IEnumerable<string> collection = new List<string>() { "a", "b", "c" };

for(int i = 0; i < collection.Count(); i++) 
{
    string str1 = collection.ElementAt(i);
    // do your stuff   
}
Run Code Online (Sandbox Code Playgroud)

也许你也想这种方法:-)

  • 为什么会有这么多的赞成?这将枚举可枚举的2n次而不是一次. (7认同)
  • 更糟糕的是,IEnumerable 不支持 Count() 或 ElementAt()。我认为他正在考虑 IList。这实际上根本没有回答这个问题。 (3认同)
  • @RomanReiner 因为这有效,所以有些人不关心性能:) (2认同)
  • 如果您查看 ElementAt 的实现,您会发现如果集合是 IList,它们将使用 [] 返回索引处的元素;然而,与 [] 的性能相同;如果没有,他们将获得 Enumerator 并在返回元素之前开始按顺序查找元素的迭代,因此基本上为每个元素创建一个新的枚举器并再次导航列表...... (2认同)

Dar*_*rov 7

foreach (var element in instanceOfAClassThatImplelemntIEnumerable)
{

}
Run Code Online (Sandbox Code Playgroud)