我在我的VS 2008 C#项目中使用了 List<T>.First()
和 List<T>.Last()
,但是当我降级到2005时,出现了以下错误:
'System.Collections.Generic.List' 不包含 'First' 的定义
据我所知,如果仍然存在 Find() 和 FindLast() 方法,那么一定有一种非常简单的方法来获取迭代器到第一个和最后一个值,是吗?但是我卡在这里,找不到任何有用的东西 :(
我在我的VS 2008 C#项目中使用了 List<T>.First()
和 List<T>.Last()
,但是当我降级到2005时,出现了以下错误:
'System.Collections.Generic.List' 不包含 'First' 的定义
据我所知,如果仍然存在 Find() 和 FindLast() 方法,那么一定有一种非常简单的方法来获取迭代器到第一个和最后一个值,是吗?但是我卡在这里,找不到任何有用的东西 :(
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();
但效果是一样的。
这里存在2个问题:
这些是扩展方法。你提出了一个典型的反对扩展方法的案例,因为它们似乎属于类,但实际上是在其他地方定义的,所以可能会令人困惑。对于List的第一个/最后一个元素,你仍然可以使用list[0]和list[list.Count-1](当然要添加错误处理)。