2009-07-01 6 views
7

J'essaie d'utiliser LINQ pour extraire des données d'un dictionnaire.Utilisation de Lambda avec des dictionnaires

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

Les lignes ci-dessus, Q1 et Q2, à la fois en raison d'une erreur du compilateur.

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

Comment puis-je utiliser LINQ pour trouver des valeurs dans un dictionnaire?

Merci,

Rick

Répondre

24

Soit

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

ou

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

Juste pour clarifier, la raison pour laquelle cela fonctionne est que les actes comme un dictionnaire IEnumerable > –

+1

deuxième expression devrait aussi avoir Val.par == « Apple » comme p sera une paire <,>. – Richard

+5

Vous obtiendrez une expression qui renvoie un résultat IEnumerable. Si vous voulez réellement l'objet réel, vous devez appeler Single() ou First() –

8

vous avez un supplément "de obj dans" dans vos déclarations qui ne sont pas nécessaires. Supprimez-le ou remplacez le .Where par la syntaxe de la requête linq au lieu de la syntaxe de la méthode.

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

Première expression devrait également avoir p.Value == "Apple" comme p sera une paire <,>. – Richard

+3

Pas vrai, il sélectionne testDict.Values, qui est un IEnumerable . Il n'aurait que KeyValuePairs s'il avait sélectionné testDict lui-même. –

Questions connexes