我在C#中有一个IEnumerable对象列表。我可以使用a for each循环并仔细检查每个对象,但是在这种情况下,我想要做的就是检查第一个对象是否有办法在不使用foreach循环的情况下执行此操作?
我尝试过mylist [0]但是没有用。
由于
答案 0 :(得分:23)
(为方便起见,此答案假定myList
实施IEnumerable<string>
;必要时用适当的类型替换string
。)
如果您使用的是.NET 3.5,请使用First()
扩展名方法:
string first = myList.First();
如果您不确定是否存在任何值,则可以使用FirstOrDefault()
方法,该方法将返回null
(或更一般地,元素类型的默认值)空序列。
如果没有foreach
循环,你仍然可以“走很远的路”:
using (IEnumerator<string> iterator = myList.GetEnumerator())
{
if (!iterator.MoveNext())
{
throw new WhateverException("Empty list!");
}
string first = iterator.Current;
}
虽然这很丑陋:))
在回答你的评论时,不,返回的迭代器最初是而不是位于第一个元素;它位于之前第一个元素。你需要调用MoveNext()
将它移动到第一个元素,这就是你如何区分空序列和单个元素之间的区别。
编辑:想一想,我想知道这是否是一个有用的扩展方法:
public static bool TryFirst(this IEnumerable<T> source, out T value)
{
using (IEnumerator<T> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
value = default(T);
return false;
}
value = iterator.Current;
return true;
}
}
答案 1 :(得分:3)
请记住,如果序列为空,则可能没有“第一个元素”。
IEnumerable<int> z = new List<int>();
int y = z.FirstOrDefault();
答案 2 :(得分:2)
如果你不在3.5:
using (IEnumerator<Type> ie = ((IEnumerable<Type>)myList).GetEnumerator()) {
if (ie.MoveNext())
value = ie.Current;
else
// doesn't exist...
}
或
Type value = null;
foreach(Type t in myList) {
value = t;
break;
}