Visual studio 2005: список <T>.irst () список <T>.Last () методы в C #? - PullRequest
4 голосов
/ 10 апреля 2009

Я использовал List<T>.First(), а также List<T>.Last() в своем проекте VS 2008 C #, но когда я опустился до 2005 года, я получил такие ошибки:

'System.Collections.Generic.List' не содержит определения для 'First'

Насколько я понимаю, если все еще существуют методы Find () и FindLast () , ДОЛЖЕН быть очень очень простой способ получить итераторы для первого и последнего значений , я прав? Но я застрял с этим и не могу найти ничего полезного: (

Ответы [ 4 ]

11 голосов
/ 10 апреля 2009

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 голосов
/ 10 апреля 2009

Здесь 2 проблемы

  1. И First, и Last являются методами расширения. Компилятор, включенный в VS2005, не поддерживает методы расширения, поэтому их невозможно связать
  2. Первый и последний методы включены в платформу 3.5, которую нельзя использовать с VS2005.
1 голос
/ 10 апреля 2009

Это методы расширения. Вы приводите типичный случай против методов расширения, в то время как они могут сбивать с толку, поскольку они кажутся принадлежащими классу, но фактически полностью определены в другом месте. Для первого / последнего списка, вы все еще можете использовать list [0] и list [list.Count-1] (с добавленной обработкой ошибок, конечно).

1 голос
/ 10 апреля 2009

First не является методом List<T>. Первый - статический метод для System.Linq.Enumerable в .net 3.5.

...