web-dev-qa-db-fra.com

Obtenir la clé de la valeur - Dictionnaire <chaîne, Liste <chaîne >>

Je ne parviens pas à obtenir la clé en spécifiant une valeur. Quel est le meilleur moyen de réaliser cela?

var st1= new List<string> { "NY", "CT", "ME" };
var st2= new List<string> { "KY", "TN", "SC" };
var st3= new List<string> { "TX", "OK", "MO" };
var statesToEmailDictionary = new Dictionary<string, List<string>>();
statesToEmailDictionary.Add("[email protected]", st1);
statesToEmailDictionary.Add("[email protected]", st2);
statesToEmailDictionary.Add("[email protected]", st3);

var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Value.Where(y => y.Contains(state))).Key;
9
Krishh

La valeur renvoyée par FirstOrDefault sera un KeyValuePair<string, List<string>>. Pour obtenir la clé, utilisez simplement la propriété Key. Comme ça:

var emailAdd = statesToEmailDictionary
    .FirstOrDefault(x => x.Value.Contains(state))
    .Key;

Sinon, voici l'équivalent en syntaxe de requête:

var emailAdd = 
    (from p in statesToEmailDictionary
     where p.Value.Contains(state)
     select p.Key)
    .FirstOrDefault();
18
p.s.w.g

Je pense que tu veux:

var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Value.Any(y => y.Contains(state))).Key;
2
Adam

Ce que tout le monde dans ce fil n'a pas mentionné, c'est que la méthode FirstOrDefault est uniquement disponible via Linq :

using System;
using System.Collections.Generic;
// FirstOrDefault is part of the Linq API
using System.Linq;

namespace Foo {
    class Program {
        static void main (string [] args) {
            var d = new Dictionary<string, string> () {
                { "one", "first" },
                { "two", "second" },
                { "three", "third" }
            };
            Console.WriteLine (d.FirstOrDefault (x => x.Value == "second").Key);
        }
    }
}
1
erapert
var emailAdd = statesToEmailDictionary
    .FirstOrDefault(x => x.Value != null && x.Value.Contains(state))
    .Key;

Mais si vous recherchez des performances, je vous conseillerais d'inverser votre dictionnaire et de créer un dictionnaire de <state, email> pour faire ce que vous cherchez.

// To handle when it's not in the results
string emailAdd2 = null;
foreach (var kvp in statesToEmailDictionary)
{
    if (kvp.Value != null && kvp.Value.Contains(state))
    {
        emailAdd2 = kvp.Key;
        break;
    }
}
1
Joe Enos
var emailAdd = statesToEmailDictionary.First(x=>x.Value.Contains(state)).Key;
0
G.J

Linq simple à faire exactement cela 

Dim mKP = (From mType As KeyValuePair(Of <Key type>, <Value type>) In <Dictionary>
           Where mType.Value = <value seeked> Select mType).ToList

If mKP.Count > 0 then
    Dim value as <value type> = mKP.First.Value
    Dim key as <Key type> = mKP.First.Key 
End if 

Bien sûr, s'il y a des valeurs en double, cela retournera plus d'une KeyValuePair