如何从.net中的IEnumerable <T>获取第一个元素?

Tim*_*imK 144 .net c#

我经常想要抓住IEnumerable<T>.net中的第一个元素,我还没有找到一个很好的方法来做到这一点.我提出的最好的是:

foreach(Elem e in enumerable) {
  // do something with e
  break;
}
Run Code Online (Sandbox Code Playgroud)

呸!那么,有一个很好的方法来做到这一点?

Eri*_*bes 224

如果你可以使用LINQ,你可以使用:

var e = enumerable.First();
Run Code Online (Sandbox Code Playgroud)

如果enumerable为空,这将引发异常:在这种情况下,您可以使用:

var e = enumerable.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault()default(T)如果枚举为空,将返回,这将是null引用类型或值类型的默认"零值".

如果你不能使用LINQ,那么你的方法在技术上是正确的,与使用GetEnumeratorMoveNext方法来检索第一个结果创建一个枚举器没什么不同(这个例子假设enumerable是一个IEnumerable<Elem>):

Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
    if (enumer.MoveNext()) e = enumer.Current;
}
Run Code Online (Sandbox Code Playgroud)

Joel Coehoorn.Single()在评论中提到; 如果你期望你的枚举只包含一个元素,那么它也会起作用 - 但如果它是空的或大于一个元素,它将抛出异常.有一种相应的SingleOrDefault()方法以类似的方式覆盖这种情况FirstOrDefault().但是,David B解释说,SingleOrDefault()在可枚举包含多个项目的情况下,仍可能抛出异常.

编辑:感谢Marc Gravell指出我需要IEnumerator在使用它之后处理我的对象 - 我编辑了非LINQ示例以显示using关键字来实现此模式.

  • 值得指出的是SingleOrDefault将返回1)唯一的项目,如果只有一个项目.2)如果没有项目,则为null.3)如果有多个项目则抛出异常. (2认同)
  • `使用System.Linq;`好吧现在它可以工作! (2认同)

Ben*_*ter 35

以防您使用.NET 2.0并且无法访问LINQ:

 static T First<T>(IEnumerable<T> items)
 {
     using(IEnumerator<T> iter = items.GetEnumerator())
     {
         iter.MoveNext();
         return iter.Current;
     }
 }
Run Code Online (Sandbox Code Playgroud)

这应该做你正在寻找的...它使用泛型,所以你得到IEnumerable任何类型的第一项.

这样称呼它:

List<string> items = new List<string>() { "A", "B", "C", "D", "E" };
string firstItem = First<string>(items);
Run Code Online (Sandbox Code Playgroud)

要么

int[] items = new int[] { 1, 2, 3, 4, 5 };
int firstItem = First<int>(items);
Run Code Online (Sandbox Code Playgroud)

你可以很容易地修改它来模仿.NET 3.5的IEnumerable.ElementAt()扩展方法:

static T ElementAt<T>(IEnumerable<T> items, int index)
{
    using(IEnumerator<T> iter = items.GetEnumerator())
    {
        for (int i = 0; i <= index; i++, iter.MoveNext()) ;
        return iter.Current;
    }
} 
Run Code Online (Sandbox Code Playgroud)

这样称呼它:

int[] items = { 1, 2, 3, 4, 5 };
int elemIdx = 3;
int item = ElementAt<int>(items, elemIdx);
Run Code Online (Sandbox Code Playgroud)

当然,如果你访问LINQ,然后有很多已经贴好答案...


Ada*_*sek 26

好吧,您没有指定您正在使用的.Net版本.

假设你有3.5,另一种方法是ElementAt方法:

var e = enumerable.ElementAt(0);
Run Code Online (Sandbox Code Playgroud)

  • ElementAt(0),简单明了. (2认同)

Amy*_*y B 6

FirstOrDefault

Elem e = enumerable.FirstOrDefault();
//do something with e
Run Code Online (Sandbox Code Playgroud)