2011-12-15 8 views
2

私はクライアントタイプのIListを持っています。私はそれを繰り返す必要があり、いくつかの条件に一致する要素を返します。私は、foreachのより「賢く」の方法を使用していたので、私はシングルの方法を試してみました、しかし、私は、なぜこの作品を確認していないと、それは別の方法(私は進んでいないよ)に行うことができる場合:IlistのFuncを使用して、なぜラムダ式ですか?

private client GetClientByID(short ID) 
{ 
    return this.ListOfClient.Single(c => c.ID == ID); 
} 

を私はしないでくださいラムダ式の使用を理解しています。匿名メソッドを試しましたが、正しく書くことができませんでした。 ありがとう

+0

'Single'は' foreach'を使って実装されています。 'Single'はリスト全体を反復し、厳密に一つの' Client'が基準に合っていなければ例外をスローします。代わりに 'First'または' FirstOrDefault'を使用することができます。 –

答えて

1

コードは正しいですが、このラムダ式は基本的にbool(この特定のケースでは) 。 ListOfClientのすべてのアイテムについて、そのメソッドを実行しようとします。それがtrueを返した場合、アイテムを返します。

あなたは、リスト内に0個以上の一致がある場合、失敗することに注意してください。

  • List.SingleOrDefault() //returns null if there are 0 items, fails if there are more than 1
  • List.First() //fails if there are 0 items
  • List.FirstOrDefault() //never fails, returns null if there are 0 items
+0

ありがとう、lambaなしでそれを書く方法がありますか?彼らがもっと意味を持っているので、私はラムバ式でかなり混乱しています。そしてヘルプには、Func <>があります。 –

+0

@Petr、c => c.ID == IDと書くと、それは実際には 'Func 'です。 Func <>が持つ意味は、何かを返すメソッドであり、パラメータでいくつかのものを取ります。 –

+0

ありがとう、lamba式なしで書くことは可能ですか?もしそうなら、あなたは私にどのように表示できますか?ありがとう –

0
:あなたは、次のいずれかを使用することができないならば、それは、罰金のみ1項目が存在することを確信している場合

からMSDN

ラムダ式は、式とステートメントを含むことができる無名関数であり、デリゲートまたは式ツリー型の作成に使用できます。あなたのコードを意味

private client GetClientByID(short ID) 
{ 
    return this.ListOfClient.Single(delegate(Client c) { return c.ID == ID; }); 
} 

シングルと同等であることはanother article of MSDN

から二番目のパラメータ

Func<TSource, bool> predicate 

Enumerable.Single Method (IEnumerable, Func) 注意を払うように決定することができ、LINQの拡張メソッドであります

述語デリゲート。一連の条件を定義し、指定されたオブジェクトが基準を満たすかどうかを判断するメソッドを表します。

つまり、コレクションの各要素について条件return c.ID == ID;を確認し、要件に答えるものを返します。

PS Singleに注意してください。タスクに応じてSingleOrDefaultまたはFirstOrDefaultを使用することをお勧めします。