2009-04-10 13 views
4

は私がList<T>.First()だけでなく、私のVS 2008 C#プロジェクトでList<T>.Last()を使用しますが、私は2005年に格下げしましたとき、私は、このようなエラーを得た:Visual studio 2005:List <T> .First()リストC#の<T> .Last()メソッド?

「System.Collections.Generic.List」 'の定義が含まれていません。私の知る限り理解し、まだ検索()FindLast()メソッドがある場合は、最初と最後の値にイテレータを取得するには非常に、非常に簡単な方法がなければならない最初の」

、私は右ですか?しかし、私はこれにこだわっていると便利な何かを見つけることができません:(

答えて

11

First()Last()は、彼らがあなたのVS 2005のプロジェクトで発見されていない理由であるLINQの一部である。

あなたがしている場合それは本当にだList<T>を、使用して本当に、リストをと仮定すると非空で最初と最後の値を見つけるのは簡単:

を:あなたは本当にあなたが本当に簡単にLINQのメソッドを実装することができますイテレータを使用する必要がある場合

T first = list[0]; 
T last = list[list.Count-1]; 

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; 
} 

(私はsourceIList<T>かではなく、そうならば、コレクション全体を反復処理することを避けるために、list[list.Count-1]を返すかどうかLastチェックの実際の実装を疑う。)

コメントで指摘したように、これらの拡張メソッドではありません - 次のように記述します。

// Assuming the method is in a CollectionHelpers class. 
Foo first = CollectionHelpers.First(list); 

代わりの

Foo first = list.First(); 

でも効果は同じです。

+0

LINQのFirst()とLast()は、リストの最初または最後の項目を取得するより複雑です。関数を満たす最初または最後の項目を検索するために使用される述語を受け入れます。つまり、ラムダ関数に渡して最初の一意の項目を見つけることができます。 –

+0

述部を受け入れるオーバーロードは、はいです。しかし、OPがFindとFindLast(これらのオーバーロードと同等です)を認識しているので、彼は実際にはパラメータのないものに興味があると思います。 –

+0

拡張メソッドではありません.net 3.0の一部、つまりVS2005(.net 2.0)にはありません – FryGuy

2

ここ2つの問題

  1. 最初と最後の両方が拡張メソッドですがあります。 VS2005に含まれるコンパイラは拡張メソッドをサポートしていないため、バインドする方法はありません。
  2. FirstおよびLastメソッドは、VS2005で使用できない3.5フレームワークに含まれています。
1

FirstList<T>の方法ではありません。 Firstは、.net 3.5のSystem.Linq.Enumerableの静的メソッドです。

1

これは拡張メソッドです。拡張メソッドには典型的なケースがありますが、クラスに属しているように見えるので混乱する可能性がありますが、実際は別の場所で定義されています。リストの最初/最後の場合は、list [0]とlist [count.Count-1]を使用することができます(もちろんエラー処理が追加されています)。

関連する問題