2009-07-01 17 views
7

Estoy tratando de usar LINQ para recuperar algunos datos de un diccionario.Uso de Lambda con diccionarios

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

Las líneas anteriores, q1 y q2, ambas dan como resultado un error de compilación.

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

¿Cómo hago para usar LINQ para encontrar valores en un diccionario?

Gracias,

Rick

Respuesta

24

De cualquier

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

o

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

Solo para aclarar, la razón por la que esto funciona es que el diccionario actúa como un IEnumerable > –

+1

segunda expresión también debe tener Valor PD == "Apple", como p será un Par <,>. – Richard

+5

Esos obtendrán una expresión que devuelve un resultado IEnumerable. Si realmente desea el objeto real, tiene que llamar a Single() o First() –

8

usted tiene un extra "de obj en" en sus declaraciones que no se necesita. Elimine eso o cambie el .Where a la sintaxis de la consulta de linq en lugar de la sintaxis del método.

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

La primera expresión también debe tener p.Value == "Apple", ya que p será un par <,>. – Richard

+3

No es cierto, selecciona de testDict.Values, que es un IEnumerable . Solo obtendría KeyValuePairs si seleccionaba de testDict. –