Obtenir la clé de la valeur - Dictionnaire<string, List<string>>
J'ai de la difficulté à obtenir la clé en spécifiant une valeur. Quel est le meilleur moyen que je peux accomplir 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;
OriginalL'auteur Krishh | 2013-05-31
Vous devez vous connecter pour publier un commentaire.
La valeur de retour de
FirstOrDefault
sera unKeyValuePair<string, List<string>>
, de sorte à obtenir la clé, il suffit d'utiliser laKey
de la propriété. Comme ceci:Sinon, ici, est l'équivalent dans la syntaxe de la requête:
FirstOrDefault(...).Key
dangereux, comme un comportement inattendu lorsque "OrDefault" qui se passe ici?Le " OrDefault le cas de renvoie la valeur par défaut du type que vous avez à parcourir. Pour les types référence, c'est
null
, mais pour les types de valeur, il sera une nouvelle instance de ce type. DepuisKeyValuePair<TKey, TValue>
est un type de valeur (c'est à dire unstruct
), le " OrDefault cas ne sera pas nulle référence exception. DepuisTKey
ici eststring
, le.Key
de cette nouvelle instance seranull
.OriginalL'auteur p.s.w.g
Je pense que vous voulez:
OriginalL'auteur Adam
Mais si vous êtes à la recherche pour les performances, je vous suggère d'inverser votre dictionnaire et la création d'un dictionnaire de
<state, email>
de faire ce que vous êtes à la recherche pour.NullReferenceException
?Je ne le pense pas, dans un one-liner au moins. Édité avec un non-LINQ vérifier. Il fait la même chose que le LINQ on n' - boucle à travers chaque valeur jusqu'à ce qu'il en trouve une, les sauts hors de la boucle. Si jamais, il en trouve une, la valeur d'origine de la valeur null est conservé.
En fait, si vous receviez une NullReferenceException, la liste elle-même doit avoir été nulle. Vous pouvez gérer tout cela à l'intérieur de la lambda. Mis à jour.
OriginalL'auteur Joe Enos
Ce que tout le monde dans ce fil de discussion a omis de mentionner, c'est que le
FirstOrDefault
méthode est uniquement disponible par le biais de Linq:OriginalL'auteur erapert
OriginalL'auteur G.J
Linq Simple de le faire
Bien sûr, si il y a des valeurs en double, ce sera le retour de plus d'un
KeyValuePair
OriginalL'auteur Christian Alain Ouellet
KeyValuePair<T, U>
est un struct, donctemp
ne sera jamais nulle.J'ai le même cas d'utilisation où je dois récupérer la valeur lorsque la clé = [email protected].I fatigué ci-dessous qui ne donne pas les résultats attendus. var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Key == "[email protected]").Valeur;
OriginalL'auteur SamiHuutoniemi