2011-11-13 27 views
22

मैं शब्दकोश Dictionary<string, Point>द्वारा एक शब्दकोश सॉर्ट करने के लिए कैसे कुंजी

कुंजी सी 1, सी 3, सी 2, t1,, टी -4, t2 मैं सॉर्ट करने के लिए उन्हें C1, C2, C3, T1, T2 होना चाहते है, t3

मैं

Input.OrderBy(key => key.Key); 

का उपयोग कर इसे सुलझाने के लिए कोशिश कर रहा हूँ, लेकिन यह

किसी भी विचार के समाधान का तरीका काम नहीं करता है कि

+1

यह प्रकार पर सभी नहीं, या बस आपको उम्मीद कर रहे थे में नहीं करता है? –

+0

यह यह करने के लिए – AMH

+1

http://stackoverflow.com/questions/289/how-do-you-sort-a-c-sharp-dictionary-by-value संदर्भ सॉर्ट नहीं है कि यह कुछ बहुत अच्छा उदाहरण है। –

उत्तर

-5

ठीक जांच शब्दकोश में का उपयोग यह काम करना चाहिए

var r = new Dictionary<string, Point>(); 
r.Add("c3", new Point(0, 0)); 
r.Add("c1", new Point(0, 0)); 
r.Add("t3", new Point(0, 0)); 
r.Add("c4", new Point(0, 0)); 
r.Add("c2", new Point(0, 0)); 
r.Add("t1", new Point(0, 0)); 
r.Add("t2", new Point(0, 0)); 
var l = r.OrderBy(key => key.Key); 
var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value); 

foreach (var item in dic) 
{ 

    Console.WriteLine(item.Key); 
} 
Console.ReadLine(); 
+1

-1: यह काम नहीं करेगा। आपने अभी ऑर्डर करने के साथ एक और शब्दकोश बनाया है। यह छोटे शब्दकोशों के लिए काम कर सकता है लेकिन अंततः विफल हो जाएगा। – leppie

+0

हम चैट में चले गए और मुझे पता है कि वह क्या चाहता है इसलिए मैंने उसकी समस्या को हल करने में उसकी मदद की – DeveloperX

+10

@ डेवलपर - मेरा अनुमान है कि लोग नीचे मतदान कर रहे हैं क्योंकि यह सवाल का जवाब नहीं देता है। हम चैट नहीं देखते हैं, इसलिए लोग शायद इस सवाल का एक उपयोगी जवाब नहीं मानते कि हम देखते हैं। –

5

बस एक अनुमान है लेकिन ऐसा लगता है कि आप मान रहे हैं कि यह इनपुट सॉर्ट करने जा रहा है। ऑर्डरबी विधि वास्तव में एक IOrderedEnumerable का एक क्रमिक उदाहरण देता है जिसमें समान मान होते हैं। आप वापसी मान रखना चाहते हैं तो आपको नीचे कर सकते हैं:

IOrderedEnumerable orderedInput 
orderedInput = Input.OrderBy(key=>key.Key) 

अधिकांश तरीकों कि संग्रह को संशोधित करेगा यह एक ही पैटर्न का पालन करें। ऐसा इसलिए होता है कि यह मूल संग्रह उदाहरण को बदल नहीं रहा है। यह आपको उस घटना को गलती से बदलने से बचाता है जब आप इरादा नहीं लेते थे। यदि आप केवल क्रमबद्ध उदाहरण का उपयोग करना चाहते हैं तो आप ऊपर दिखाए गए अनुसार विधि की वापसी के लिए चर सेट करें।

25

Input.OrderBy शब्दकोश को सॉर्ट नहीं करता है, यह एक क्वेरी बनाता है जो ऑर्डर किए गए ऑर्डर में आइटम लौटाता है।

शायद OrderedDictionary आपको जो चाहिए वह देता है।

या सामान्य SortedDictionary

+0

का डुप्लिकेट लेकिन यह सामान्य नहीं है और इसका प्रदर्शन समस्या होगी – AMH

+2

@AMH प्रदर्शन के बारे में धारणाएं न बनाएं जब तक कि आपने इसे वास्तविक रूप से परीक्षण नहीं किया हो (माइक्रो -बेंचमार्क गिनती नहीं है)। – Richard

+2

आप कैसे जानते हैं कि प्रदर्शन एक समस्या होगी? –

0

मैं

var l = Input.OrderBy(key => key.Key); 

इस्तेमाल किया है और मैं इसे परिवर्तित

+1

ए मैंने कहा: यह शब्दकोश को सॉर्ट नहीं करता है! यह एक क्रमबद्ध 'दृश्य' बनाता है। –

4

लोड अवर्गीकृत वस्तु में एक SortedDictionary वस्तु इस प्रकार है:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData); 

जहां unsortedCustomerData एक ही सामान्य प्रकार (शब्दकोश स्ट्रिंग, स्ट्रिंग या आपके मामले स्ट्रिंग, बिंदु) में है। यह स्वचालित रूप से नई ऑब्जेक्ट को

msdn के अनुसार सॉर्ट करेगा: सॉर्टेड डिक्शनरी (IDictionary): सॉर्ट किए गए डिक्शनरी क्लास का एक नया उदाहरण आरंभ करता है जिसमें निर्दिष्ट IDictionary से कॉपी किए गए तत्व होते हैं और कुंजी प्रकार के लिए डिफ़ॉल्ट आईसीओएमपेयर कार्यान्वयन का उपयोग करते हैं।

2

निम्न कोड दो और list से sort एक शब्दकोश का उपयोग करता है।

using System; 
using System.Collections.Generic; 
using System.Drawing; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      Dictionary<string,Point> r=new Dictionary<string,Point>(); 
      r.Add("c3",new Point(0,1)); 
      r.Add("c1",new Point(1,2)); 
      r.Add("t3",new Point(2,3)); 
      r.Add("c4",new Point(3,4)); 
      r.Add("c2",new Point(4,5)); 
      r.Add("t1",new Point(5,6)); 
      r.Add("t2",new Point(6,7)); 
      // Create a list of keys 
      List<string> zlk=new List<string>(r.Keys); 
      // and then sort it. 
      zlk.Sort(); 
      List<Point> zlv=new List<Point>(); 
      // Readd with the order. 
      foreach(var item in zlk) { 
       zlv.Add(r[item]); 
      } 
      r.Clear(); 
      for(int i=0;i<zlk.Count;i++) { 
       r[zlk[i]]=zlv[i]; 
      } 
      // test output 
      foreach(var item in r.Keys) { 
       Console.WriteLine(item+" "+r[item].X+" "+r[item].Y); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 

उपरोक्त कोड का आउटपुट नीचे दिखाया गया है।

c1 1 2 
c2 4 5 
c3 0 1 
c4 3 4 
t1 5 6 
t2 6 7 
t3 2 3 
2

इनपुट के बाद से। ऑर्डरबी एक क्वेरी बनाता है जो आदेशित क्रम में आइटम लौटाता है, बस इसे उसी शब्दकोश में असाइन करें।

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

संबंधित मुद्दे