2009-07-01 22 views
7

Próbuję użyć LINQ do pobrania niektórych danych ze słownika.Używanie Lambda ze słownikami

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"); 

Powyższe linie, q1 i q2, powodują błąd kompilatora.

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

Jak używać LINQ do wyszukiwania wartości w słowniku?

Dziękuję

Rick

Odpowiedz

24

Albo

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

lub

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

Właśnie w celu wyjaśnienia, powodem tego jest to, że działa słownika działa jako IEnumerable > –

+1

drugie wyrażenie powinno mieć również p.Value == „Apple”, jak p będzie Pair <,>. – Richard

+5

Otrzymają one wyrażenie, które zwraca wynik IEnumerable. Jeśli faktycznie chcesz rzeczywistego obiektu, musisz zadzwonić do Single() lub First() –

8

masz dodatkowy "od obj się" w swoim sprawozdaniu, że nie jest potrzebne. Usuń to lub zmień .Where na składnię zapytania linq zamiast składni metody.

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

Pierwsze wyrażenie powinno mieć także p.Value == "Apple", ponieważ p będzie parą <,>. – Richard

+3

To nieprawda, on wybiera z testDict.Values, który jest IEnumerable . Dostanie tylko KeyValuePairs, jeśli wybierze z samego TestDict. –

Powiązane problemy