2009-07-01 9 views
7

LINQを使用して辞書からデータを取得しようとしています。Lambdaを辞書で使用する

var testDict = new Dictionary<int, string>(); 
    testDict.Add(1, "Apple"); 
    testDict.Add(2, "Cherry"); 

    var q1 = from obj in testDict.Values.Where(p => p == "Apple"); 
    var q2 = from obj in testDict.Where(p => p.Value == "Apple"); 

上記のq1とq2のどちらの行でも、コンパイラエラーが発生します。

error CS0742: A query body must end with a select clause or a group clause 

LINQを使用して辞書の値を検索するにはどうすればよいですか?

はあなたが必要とされていない、あなたの文の "にOBJから" 余分を持っている

リック

答えて

24

どちらか

var q1 = from obj in testDict.Values where obj == "Apple" select obj; 

または

var q1 = testDict.Where(p => p.Value == "Apple"); 
+1

だけ明確にする、これが機能する理由は、IEnumerableを>として辞書の行為 –

+1

セカンド表現pがペアになるようにも==「アップル」p.Valueを持っている必要があります<,>。 – Richard

+5

これらは、IEnumerableの結果を返す式を取得します。あなたが実際のオブジェクトを実際にしたい場合は、Single()またはFirst()を呼び出す必要があります –

8

、ありがとうございます。削除するか、メソッド構文の代わりに.Whereをlinqクエリ構文に変更してください。

var q1 = from obj in testDict.Values 
     where obj.Value == "Apple" 
     select obj;  
var q2 = testDict 
     .Where(p => p.Value == "Apple"); 
+0

pはペア<,>となるため、最初の式にはp.Value == "Apple"が必要です。 – Richard

+3

実際には、彼はtestDict.Valuesから選択しています。これはIEnumerable です。彼はtestDict自体から選択した場合にのみKeyValuePairsを取得します。 –

関連する問題