Visual Studio 2005:在C#中列出<t> .First()List <t> .Last()方法?</t> </t>

时间:2009-04-10 19:10:40

标签: c# .net visual-studio-2005

我在VS 2008 C#项目中使用了List<T>.First()List<T>.Last(),但是当我降级到2005年时,我遇到了这样的错误:

'System.Collections.Generic.List'不包含'First'的定义

据我所知,如果仍然有 Find() FindLast()方法,那么必须有一种非常简单的方法来获取第一个迭代器和最后的价值观,我是对的?但我坚持这个,找不到任何有用的东西:(

4 个答案:

答案 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)

这里有两个问题

  1. First和Last都是扩展方法。 VS2005中包含的编译器不支持扩展方法,因此无法绑定它们
  2. 第一个和最后一个方法包含在3.5框架中,VS2005无法使用。

答案 2 :(得分:1)

First不是List<T>的方法。 First是.net 3.5中System.Linq.Enumerable的静态方法。

答案 3 :(得分:1)

这些是扩展方法。你提出了一个反对扩展方法的典型案例,但它们可能会令人困惑,因为它们似乎属于类,但实际上是完全定义在其他地方。对于List的第一个/最后一个,您仍然可以使用list [0]和list [list.Count-1](当然还添加了错误处理)。