2009-09-22 17 views
17

मैं एक डिक्शनरी से कोई डुप्लिकेट मानों के साथ शब्दकोश कैसे बना सकता हूं जिसमें डुप्लिकेट मान हो सकते हैं?सी #: शब्दकोश से डुप्लिकेट मूल्य हटाएं?

IDictionary<string, string> myDict = new Dictionary<string, string>(); 

myDict.Add("1", "blue"); 
myDict.Add("2", "blue"); 
myDict.Add("3", "red"); 
myDict.Add("4", "green"); 


uniqueValueDict = myDict.??? 

संपादित करें:

मैं परवाह नहीं है जो कुंजी रखा है। - क्या अलग() ऑपरेशन का उपयोग कर कुछ है?

+6

आप कौन सी कुंजी रखना चाहते हैं? '" 1 "', '" 2 "', या कोई नहीं? – dtb

+0

[http://www.codeproject.com/KB/linq/Unique.aspx ](http://www.codeproject.com/KB/linq/Unique.aspx) –

+0

मुझे लगता है कि आपको इसके बारे में अधिक जानकारी देने की आवश्यकता है अद्वितीय बनाने के कार्य का व्यवहार। नीले रंग के लिए, कौन सी कुंजी रखना चाहिए, 1 या 2? – Tesserex

उत्तर

43

डुप्लिकेट के साथ आप क्या करना चाहते हैं?

IDictionary<string, string> myDict = new Dictionary<string, string>(); 

myDict.Add("1", "blue"); 
myDict.Add("2", "blue"); 
myDict.Add("3", "red"); 
myDict.Add("4", "green"); 

HashSet<string> knownValues = new HashSet<string>(); 
Dictionary<string, string> uniqueValues = new Dictionary<string, string>(); 

foreach (var pair in myDict) 
{ 
    if (knownValues.Add(pair.Value)) 
    { 
     uniqueValues.Add(pair.Key, pair.Value); 
    } 
} 

आप .NET 3.5 का उपयोग कर रहे, बेशक मान लिया गया है कि: यदि आप कोई आपत्ति नहीं है जो कुंजी आप खो देते हैं, सिर्फ इस तरह एक और शब्दकोश का निर्माण। अगर आपको .NET 2.0 समाधान की आवश्यकता है तो मुझे बताएं।

यहाँ एक LINQ आधारित समाधान है जो मुझे सुखद कॉम्पैक्ट लगता है ...

var uniqueValues = myDict.GroupBy(pair => pair.Value) 
         .Select(group => group.First()) 
         .ToDictionary(pair => pair.Key, pair => pair.Value); 
+0

वाह जॉन, आपने लगभग 100 के निशान तोड़ दिए :-) –

+10

वह 100K के बाद बहुत कम जानता है, यह 0 पर वापस लौटता है, ruuhaha – SwDevMan81

+0

धन्यवाद। Linq समाधान वह है जो मैं खोज रहा था। जिज्ञासा क्या आप किसी भी तरह से अलग विस्तार विधि का उपयोग कर सकते हैं? – User

1
foreach (var key in mydict.Keys) 
    tempdict[mydict[key]] = key; 
foreach (var value in tempdict.Keys) 
    uniquedict[tempdict[value]] = value; 
8

जानवर बल समाधान है निम्नलिखित

var result = dictionary 
    .GroupBy(kvp => kvp.Value) 
    .ToDictionary(grp => grp.First().Value, grp.Key) 

की तरह कुछ आप डॉन 'मानते हुए किया जाएगा वास्तव में डुप्लीकेट के समूह का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली कुंजी के बारे में परवाह नहीं करते हैं और यह शब्दकोश को पुनर्निर्माण के लिए स्वीकार्य है।

+0

मैंने linq-like समाधान की कल्पना करने की कोशिश की लेकिन मेरी उंगलियों पर वीएस नहीं था। इस दृष्टिकोण को भौतिक बनाने के लिए +1 ;-) – queen3

+0

मुझे यकीन नहीं है कि यह संकलित भी है ... बस वीएस को आग लगाना और इसे जांचना ... –

+0

संकलित नहीं हुआ क्योंकि मुझे याद आया। पहले() कॉल के बाद, लेकिन इसे ठीक किया। –

1
Dictionary<string, string> test = new Dictionary<string,string>(); 
test.Add("1", "blue"); 
test.Add("2", "blue"); 
test.Add("3", "green"); 
test.Add("4", "red"); 
Dictionary<string, string> test2 = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, string> entry in test) 
{ 
    if (!test2.ContainsValue(entry.Value)) 
     test2.Add(entry.Key, entry.Value); 
} 
3

जॉन मुझे .NET 3.5 समाधान के लिए हरा, लेकिन यह अगर आप एक .NET 2.0 समाधान की जरूरत है काम करना चाहिए:

 List<string> vals = new List<string>(); 
     Dictionary<string, string> newDict = new Dictionary<string, string>(); 
     foreach (KeyValuePair<string, string> item in myDict) 
     { 
      if (!vals.Contains(item.Value)) 
      { 
       newDict.Add(item.Key, item.Value); 
       vals.Add(item.Value); 
      } 
     } 
0

जॉन स्कीट का जवाब देने के लिए इसके अलावा, आपके मूल्य है अगर एक प्रशिक्षु ऑब्जेक्ट का उपयोग कर सकते हैं:

var uniqueValues = myDict.GroupBy(pair => pair.Value.Property) 
        .Select(group => group.First()) 
        .ToDictionary(pair => pair.Key, pair => pair.Value); 

इस तरह आप केवल वस्तु में से एक संपत्ति पर डुप्लिकेट निकाल देंगे

1

इस तरह मैंने किया:

   dictionary.add(control, "string1"); 
       dictionary.add(control, "string1"); 
       dictionary.add(control, "string2"); 
       int x = 0; 
     for (int i = 0; i < dictionary.Count; i++) 
     {   
      if (dictionary.ElementAt(i).Value == valu) 
      { 
       x++; 
      } 
      if (x > 1) 
      { 
       dictionary.Remove(control); 
      } 
     } 
0

बस Revit एपीआई का उपयोग कर उन लोगों के लिए एक फुटनोट, यह एक विधि है कि, डुप्लिकेट तत्वों को दूर करने से आप अपने ऑब्जेक्ट प्रकार के रूप में wallType कहना उपयोग नहीं कर सकते जब में मेरे लिए काम करता है और इसके बजाय कच्चे तत्वों का लाभ उठाने की जरूरत है। यह एक सुंदर साथी है।

//Add Pair.value to known values HashSet 
       HashSet<string> knownValues = new HashSet<string>(); 

       Dictionary<Wall, string> uniqueValues = new Dictionary<Wall, string>(); 

       foreach (var pair in wall_Dict) 
       { 
        if (knownValues.Add(pair.Value)) 
        { 
         uniqueValues.Add(pair.Key, pair.Value); 
        } 
       } 
संबंधित मुद्दे