如何遍历支持IEnumerable的集合?


Answers:


155

每个人都会有一个常规:

foreach (var item in collection)
{
    // do your stuff   
}

这比.ElementAt()更快。不幸的是,我的投票被锁定在Alexa的答案上,所以我无法撤消它,但这是最好的答案。+1
Leo Gurdian

那么,如何解决“可能的IEnumerable多重枚举”的问题呢?
SharpC

1
@SharpC:最简单的方法是将结果提取到List <T>或数组中,然后将其传递到需要对其进行迭代的各个位置。这保证了结果的(可能很昂贵的)枚举仅发生一次,但以将结果存储在内存中为代价。我的第一步是找出多重枚举实际上是否是一个问题。
FredrikMörk,

93

除了已经提出的使用foreach循环的方法外,我想我还要提到的是,实现的任何对象IEnumerable还可以IEnumerator通过该GetEnumerator方法提供接口。尽管通常不需要此方法,但可以将其用于手动迭代集合,并且在编写自己的集合扩展方法时特别有用。

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

一个主要的例子是当您想同时迭代两个序列时,这是不可能的foreach


7
不要忘记配置枚举器。
埃里克·利珀特

@Eric:是的,我将其添加进去,因为很容易错过。
Noldorin

1
我认为这仅适用于IEnumerable <T>对象,而不适用于IEnumerable。我有一个通用的案例,其中我不得不转换为IEnumerable,因此,我没有可用的GetEnumerator方法。无论如何,对于大多数情况还是不错的。
Fabio Milheiro

50

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

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   
}

也许您也想要这种方法:-)


9
为什么会有这么多的投票?这将枚举2n次而不是一次。
罗曼·赖纳

1
@RomanReiner,因为这行得通,所以有些人不必理会表演:)
Khateeb321 '16

@RomanReiner这是一个很好的例子,我需要将一个Collection的每个元素分配给另一个collection,我认为我无法使用foreach做到这一点
AminM

@AminM如果需要索引,Linq会提供Select重载。或者将i = 0放在foreach之前,并将i ++放在循环体内。所有这些都比在for循环内使用ElementAt迭代可枚举的对象更好。
Roman Reiner

1
比这更糟糕的是,IEnumerable不支持Count()或ElementAt()。我认为他正在考虑IList。实际上,这根本无法回答问题。
krowe


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.