2014-05-19 8 views
9

की कुंजी आज आपके लिए एक आसान है लेकिन मैं वर्तमान में मंडलियों में घूम रहा हूं। इस परिदृश्य पर विचार करें:सी # शब्दकोश न्यूनतम मूल्य

var tempDictionary = new Dictionary<string, int>(); 
tempDictionary.Add("user 1", 5); 
tempDictionary.Add("user 2", 3); 
tempDictionary.Add("user 3", 5); 

Console.WriteLine(tempDictionary.Min(x => x.Key) + " => " tempDictionary.Min(x => x.Value); 

उपरोक्त रिटर्न "उपयोगकर्ता 1 => 3"।

आप एक शब्दकोश में सबसे कम मूल्य के साथ कुंजी वापस करने के बारे में कैसे जाएंगे? इसके बाद का आउटपुट इसके जैसा दिखाई देगा: "user2 => 3"

कोई विचार?

+1

संभव डुप्लिकेट http://stackoverflow.com/questions/2805703/good-way-to-get-the-key -फ-द-हाई-ए-डिक्शनरी-इन-सी-तेज) (और इसे प्रतिबिंबित करने के उत्तरों में संपादन आते हैं) –

उत्तर

19
+0

बढ़िया, यह वही है जो मैं नियमित लिनक में था। बस स्टैक ओवरफ्लो पर इंतजार कर रहा हूं, इसलिए मैं इसे उस उत्तर के रूप में चिह्नित कर सकता हूं जिसे मैं ढूंढ रहा था। धन्यवाद :) – Dezzamondo

3
var keyAndValue = tempDictionary.OrderBy(kvp => kvp.Value).First(); 
Console.WriteLine("{0} => {1}", keyAndValue.Key, keyAndValue.Value); 

यदि आपका डाटासेट आकार में गैर तुच्छ है, तो आप moreLinq में MinBy विस्तार सोच सकते हैं। Here's an implementation एसओ पर होस्ट किया गया।

+0

धन्यवाद स्पेंडर, शुक्र है कि सूची का आकार बहुत छोटा होगा, लेकिन अधिक Linq पकड़ने के लिए एक उपयोगी उपकरण की तरह दिखता है। इसे मेरे ध्यान में लाने के लिए धन्यवाद :) – Dezzamondo

1

से morelinq

var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key; 

या

var min = tempDictionary.Aggregate((l, r) => l.Value < r.Value ? l : r).Key; 

उपयोग करने का प्रयास इस एक:
var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);

+0

मुझे लगता है कि 'वैल' संभवतः 'शून्य' पर सेट करने के बजाय 'प्रथम' का उपयोग करके पहली पंक्ति पर उड़ना संभवतः सुरक्षित है। अन्यथा 'कंसोल। राइटलाइन' पर कॉल से पहले 'शून्य' चेक किया जाना चाहिए। – spender

+1

याप यह एक अच्छा मुद्दा है। मुझे लगता है कि FirstOrDefault अच्छा काम करता है। – Muna

1

सॉर्टिंग कम कुशल है क्योंकि यह ओ (एन लॉग एन) लेता है लेकिन न्यूनतम चुनना सिर्फ ओ (एन) होना चाहिए।

मुझे लगता है कि यह एक आसान तरीका है:

tempDictionary.Where(e => e.Value == tempDictionary.Min(e2 => e2.Value)).First() 

इस तुम भी सभी न्यूनतम मान मैं एक ऐसी ही समस्या हुई प्राप्त कर सकते हैं अगर आप सिर्फ .First()

0

हटाने का उपयोग कर और मैं के मूल्यों आदेश देने नहीं वरीय शब्दकोश, लेकिन केवल एक ही पुनरावृत्ति के साथ मिनट खोजें (ऑर्डरिंग> ओ (एन)) है। आपको कोने के मामलों और इसी तरह के खिलाफ सुरक्षा करने की आवश्यकता हो सकती है।

var s = String.Empty; 
    var min = Int32.MaxValue; 
    foreach (var item in tempDictionary) { 
     if (item.Value < min){ 
      s = item.Key; 
      min = item.Value; 
     } 
    } 

    Console.WriteLine(s + " => " + min); 
[अच्छा तरीका सी # में एक शब्दकोश का उच्चतम मूल्य की कुंजी प्राप्त करने] (की
संबंधित मुद्दे