我在VS 2008 C#项目中使用了List<T>.First()
和List<T>.Last()
,但是当我降级到2005年时,我遇到了这样的错误:
'System.Collections.Generic.List'不包含'First'的定义
据我所知,如果仍然有 Find()和 FindLast()方法,那么必须有一种非常简单的方法来获取第一个迭代器和最后的价值观,我是对的?但我坚持这个,找不到任何有用的东西:(
答案 0 :(得分:11)
First()
和Last()
是LINQ的一部分,这就是为什么在VS 2005项目中找不到它们的原因。
如果您正在使用List<T>
,那么真的很容易找到第一个和最后一个值,假设列表非空:
T first = list[0];
T last = list[list.Count-1];
如果你真的需要使用迭代器,你可以很容易地实现LINQ方法:
public static T First<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
return element;
}
throw new InvalidOperationException("Empty list");
}
public static T Last<T>(IEnumerable<T> source)
{
T last = default(T);
bool gotAny = false;
foreach (T element in source)
{
last = element;
gotAny = true;
}
if (!gotAny)
{
throw new InvalidOperationException("Empty list");
}
return last;
}
(我怀疑Last
的真实实施会检查source
是否为IList<T>
,如果是,则返回list[list.Count-1]
,以避免必须遍历整个集合。)
正如评论中所指出的,这些不是扩展方法 - 你写的是:
// Assuming the method is in a CollectionHelpers class.
Foo first = CollectionHelpers.First(list);
而不是
Foo first = list.First();
但效果是一样的。
答案 1 :(得分:2)
这里有两个问题
答案 2 :(得分:1)
First
不是List<T>
的方法。 First是.net 3.5中System.Linq.Enumerable
的静态方法。
答案 3 :(得分:1)
这些是扩展方法。你提出了一个反对扩展方法的典型案例,但它们可能会令人困惑,因为它们似乎属于类,但实际上是完全定义在其他地方。对于List的第一个/最后一个,您仍然可以使用list [0]和list [list.Count-1](当然还添加了错误处理)。