2013-05-31 2 views
9

मुझे मूल्य निर्दिष्ट करके कुंजी प्राप्त करने में समस्या हो रही है। मैं इसे कैसे प्राप्त कर सकता हूं सबसे अच्छा तरीका क्या है?मूल्य से कुंजी प्राप्त करें - शब्दकोश <स्ट्रिंग, सूची <string>>

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; 

उत्तर

17

FirstOrDefault से वापसी मान कुंजी प्राप्त करने के लिए, बस Key संपत्ति का प्रयोग कर एक KeyValuePair<string, List<string>> होंगे, इसलिए। इस तरह:

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(); 
+0

अनपेक्षित व्यवहार के रूप में 'FirstOrDefault (...)। Key', खतरनाक नहीं है जब" OrDefault "यहाँ होता हैं ? –

+2

@ChrisMarisic 'OrDefault' केस उस प्रकार का डिफ़ॉल्ट मान देता है जिस पर आप पुन: प्रयास कर रहे हैं। संदर्भ प्रकारों के लिए, यह 'शून्य' है, लेकिन मूल्य प्रकारों के लिए, यह उस प्रकार का एक नया उदाहरण होगा। चूंकि 'KeyValuePair 'एक मान प्रकार है (यानी' संरचना '),' OrDefault 'केस नतीजे का संदर्भ नहीं देगा। चूंकि 'टीकेई' यहां 'स्ट्रिंग' है, इसलिए उस नए इंस्टेंस का '.K'' शून्य 'होगा। –

1
var emailAdd = statesToEmailDictionary 
    .FirstOrDefault(x => x.Value != null && x.Value.Contains(state)) 
    .Key; 

लेकिन आप प्रदर्शन के लिए देख रहे हैं, मैं अपने शब्दकोश पीछे और का एक शब्दकोश बनाने सुझाव देंगे <state, email> जो आप खोज रहे हैं उसे करने के लिए।

// 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; 
    } 
} 
+0

'NullReferenceException' को संभालने का कोई तरीका? –

+0

मुझे ऐसा नहीं लगता है, कम से कम एक लाइनर में। गैर-LINQ चेक के साथ संपादित किया गया। यह वही काम करता है जैसे LINQ एक करता है - प्रत्येक मान के माध्यम से लूप करता है जब तक कि उसे कोई नहीं मिलता है, फिर लूप से बाहर हो जाता है। यदि यह कभी नहीं मिलता है, तो शून्य का मूल मूल्य रखा जाता है। –

+1

असल में, अगर आपको NullReferenceException मिल रहा था, तो सूची स्वयं ही शून्य होनी चाहिए। आप इसे लैम्ब्डा के अंदर संभाल सकते हैं। अपडेट किया गया। –

-1
var temp = statesToEmailDictionary.Where(x => x.Value.Contains(state)).FirstOrDefault(); 
var emailAdd = temp != null ? temp.Key : string.Empty; 
+1

'KeyValuePair ' एक संरचना है, इसलिए 'temp' कभी शून्य नहीं होगा। –

+0

मेरे पास एक ही उपयोग का मामला है जहां मुझे कुंजी प्राप्त करना होगा जब key = [email protected]। मैं नीचे थक गया जो अपेक्षित आउटपुट नहीं दे रहा है। var emailAdd = statesToEmailDictionary.FirstOrDefault (x => x.Key == "[email protected]")। मान; – Blossom

2

मुझे लगता है कि आप चाहते हैं:

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

उल्लेख करने के लिए इस सूत्र में क्या हर किसी में विफल रहा है कि 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<string, string>() { 
       { "one", "first" }, 
       { "two", "second" }, 
       { "three", "third" } 
      }; 
      Console.WriteLine (d.FirstOrDefault (x => x.Value == "second").Key); 
     } 
    } 
} 
0

सरल Linq ऐसा करने के लिए बस

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 
बेशक

अगर वहाँ डुप्लिकेट मानों इस वापस आ जाएगी एक से अधिक KeyValuePair

0
var emailAdd = statesToEmailDictionary.First(x=>x.Value.Contains(state)).Key; 
संबंधित मुद्दे