Атрымаць ключ ад значэння - Слоўнік <радок List <радок >>

У мяне паўсталі праблемы з атрыманнем ключа, паказаўшы значэнне. Што з'яўляецца лепшым спосабам я магу гэтага дасягнуць?

var st1= new List { "NY", "CT", "ME" };
var st2= new List { "KY", "TN", "SC" };
var st3= new List { "TX", "OK", "MO" };
var statesToEmailDictionary = new Dictionary>();
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

7 адказы

The return value from FirstOrDefault will be a KeyValuePair>, so to get the key, simply use the Key property. Like this:

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

Акрамя таго, тут эквівалент у сінтаксісе запыту:

var emailAdd = 
    (from p in statesToEmailDictionary
     where p.Value.Contains(state)
     select p.Key)
    .FirstOrDefault();
18
дададзена
@ChrisMarisic Довады «OrDefault» вяртае значэнне па змаўчанні тыпу вы Перабор. Для спасылкавых тыпаў, гэта нулявым , але для тыпаў значэнняў, то гэта будзе новы асобнік гэтага тыпу. Так як KeyValuePair з'яўляецца тыпам значэння (г.зн. структура ), выпадку «OrDefault" не будзе прыводзіць да нулявым апорным выключэннем. Так як TKey тут радок , то .key гэтага новага асобніка будзе нулявым .
дададзена аўтар p.s.w.g, крыніца
Не FirstOrDefault (...). Key небяспечна, так як у нечаканым паводзінах, калі "OrDefault" тут адбываецца?
дададзена аўтар Chris Marisic, крыніца

Я думаю, што вы хочаце:

var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Value.Any(y => y.Contains(state))).Key;
2
дададзена
var temp = statesToEmailDictionary.Where( x => x.Value.Contains(state)).FirstOrDefault();
var emailAdd = temp != null ? temp.Key : string.Empty;
1
дададзена
<�Код> KeyValuePair з'яўляецца структурай, таму тэмпература ніколі не будзе нулявым.
дададзена аўтар p.s.w.g, крыніца
У мяне ёсць адзін і той жа выпадак, калі выкарыстанне я павінен атрымаць значэнне, калі ключ = [email protected] стомлены, ніжэй якога не даюць чаканы вынік. вар emailAdd = statesToEmailDictionary.FirstOrDefault (х => x.Key == "[email protected]") Значэнне.
дададзена аўтар Blossom, крыніца
var emailAdd = statesToEmailDictionary
    .FirstOrDefault(x => x.Value != null && x.Value.Contains(state))
    .Key;

But if you're looking for performance, I'd suggest reversing your dictionary and creating a dictionary of to do what you're looking for.

// 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
дададзена
Я не думаю, што гэта так, у адным лайнеры, па меншай меры. Адрэдагаваны з не LINQ праверкі. Ён робіць тое ж самае, як LINQ адзін робіць - перабірае кожнага значэння да таго часу, пакуль не знойдзе, то выбухне з цыклу. Калі ён ніколі не знойдзе, то зыходнае значэнне нуля захоўваюцца.
дададзена аўтар Joe Enos, крыніца
На самай справе, калі вы атрымліваеце NullReferenceException, то сам спіс павінен быць пустым. Вы можаце справіцца з гэтым ўнутры лямбда. Абноўлена.
дададзена аўтар Joe Enos, крыніца
любы спосаб апрацоўкі NullReferenceException ?
дададзена аўтар Ilya Ivanov, крыніца

Тое, што ўсё ў гэтай тэме не ўдалося згадаць пра тое, што FirstOrDefault метад даступны толькі праз 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() {
                { "one", "first" },
                { "two", "second" },
                { "three", "third" }
            };
            Console.WriteLine (d.FirstOrDefault (x => x.Value == "second").Key);
        }
    }
}
1
дададзена

Просты Linq зрабіць толькі што

Dim mKP = (From mType As KeyValuePair(Of , ) In 
           Where mType.Value =  Select mType).ToList

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

Of course if there are duplicate values this will return more than one KeyValuePair

0
дададзена
var emailAdd = statesToEmailDictionary.First(x=>x.Value.Contains(state)).Key;
0
дададзена