2011-08-06 20 views
50

मैं निम्नलिखित वर्ग है:क्रमबद्ध एक सूची वर्णानुक्रम

void ShuffleGenericList<T>(IList<T> list) 
{ 
    //generate a Random instance 
    var rnd = new Random(); 
    //get the count of items in the list 
    var i = list.Count(); 
    //do we have a reference type or a value type 
    T val = default(T); 

    //we will loop through the list backwards 
    while (i >= 1) 
    { 
     //decrement our counter 
     i--; 
     //grab the next random item from the list 
     var nextIndex = rnd.Next(i, list.Count()); 
     val = list[nextIndex]; 
     //start swapping values 
     list[nextIndex] = list[i]; 
     list[i] = val; 
    } 
} 

मैं करना चाहते हैं क्या है विवरण की सामग्री को सॉर्ट करने के लिए:

class Detail 
{ 
    public Detail() 
    { 
     _details = new List<string>(); 
    } 
    public IList<string> Details { get { return _details; } } 
    private readonly List<string> _details; 
} 

वर्तमान में मैं बेतरतीब ढंग से उपयोग करते हुए निम्न वर्ग को सॉर्ट वर्णमाला क्रम में।

इसलिए उदाहरण के लिए यदि सामग्री इस तरह दिखेगा:

[0] a 
[1] d 
[2] b 

मैं इस विधि को चलाने के लिए सक्षम होना चाहते हैं और उन्हें में क्रमबद्ध किया है

[0] a 
[1] b 
[2] d 

किसी को भी एक आसान तरीका पता है यह करने के लिए? ध्यान दें कि सूचियों में आमतौर पर उनमें से कम से कम दस प्रविष्टियां होती हैं। क्या मैं LINQ के साथ ऐसा कर सकता हूं? क्षमा करें, लेकिन मैं LINQ से बहुत परिचित नहीं हूं मैंने अभी एक सुझाव सुना है कि मैं इसका उपयोग कर सकता हूं।

उत्तर

105

तुम बस List<T>.Sort फोन करके यथा-स्थान एक सूची सॉर्ट कर सकते हैं:

list.Sort(); 

कि प्राकृतिक का उपयोग करेगा तत्वों का क्रम, जो आपके मामले में ठीक है।

संपादित करें: ध्यान दें कि अपने कोड में, आप

_details.Sort(); 

रूप Sort विधि केवल List<T> में परिभाषित किया गया है, IList<T> नहीं देख सकते हैं। यदि आपको इसे बाहर से सॉर्ट करने की आवश्यकता है जहां आपको List<T> के रूप में इसका उपयोग नहीं है (आपको इसे List<T> भाग के रूप में नहीं डालना चाहिए) तो आपको थोड़ा और काम करने की आवश्यकता होगी।

मुझे किसी भी IList<T> के बारे में पता नहीं है- .NET में स्थित जगहों पर आधारित है, जो अब थोड़ा अजीब है, मैं इसके बारे में सोचने आया हूं। IList<T> आपको जो भी चाहिए, वह सब कुछ प्रदान करता है, इसलिए एक विस्तार विधि के रूप में लिखा जा सकता है। यदि आप उनमें से किसी एक का उपयोग करना चाहते हैं तो बहुत सारे क्विकॉर्ट्स कार्यान्वयन हैं।

आप अक्षमता का एक सा के बारे में परवाह नहीं है, तो आप हमेशा इस्तेमाल कर सकते हैं:

public void Sort<T>(IList<T> list) 
{ 
    List<T> tmp = new List<T>(list); 
    tmp.Sort(); 
    for (int i = 0; i < tmp.Count; i++) 
    { 
     list[i] = tmp[i]; 
    } 
} 

दूसरे शब्दों में, प्रतिलिपि में, तरह जगह में है, तो हल कर सूची की प्रतिलिपि वापस।


आप एक नई सूची जो मूल मान हैं लेकिन हल कर बनाने के लिए LINQ का उपयोग कर सकते हैं:

var sortedList = list.OrderBy(x => x).ToList(); 

यह निर्भर करता है जो व्यवहार आप चाहते हैं।ध्यान दें कि आपके फेरबदल विधि वास्तव में आदर्श नहीं है:

  • विधि के भीतर एक नया Random बनाना समस्याओं shown here
  • में से कुछ में चलाता है आप पाश अंदर val घोषणा कर सकते हैं - आप नहीं कर रहे हैं का उपयोग कर कि डिफ़ॉल्ट मान
  • यह अधिक मुहावरेदार Count संपत्ति का उपयोग करने के लिए, जब आप आप एक IList<T>
  • मेरे मन के साथ काम कर रहे पता है एक for पाश एक while पाश के साथ पीछे की ओर सूची से गुजरने से समझने के लिए सरल है

स्टैक ओवरफ़्लो पर फिशर-येट्स के साथ फेरबदल के अन्य कार्यान्वयन कर रहे हैं - खोज और आप बहुत जल्दी से एक मिल जाएगा।

+0

तो अगर मैं ऊपर बनाई गई सूची को सॉर्ट करना चाहता हूं तो क्या मुझे बस यह कहना होगा: sortedList.Sort? – Mariko

+0

मैंने सॉर्ट करने की कोशिश की लेकिन काम करने के लिए यह नहीं मिल सकता.- मेरी सूची इस तरह दिखती है: IList एनडी। मैंने nD.Sort() की कोशिश की लेकिन यह कहता है: प्रतीक 'सॉर्ट' को हल नहीं कर सकता। – Mariko

+0

@ मारिको: इसके बजाय '_details.Sort()' का उपयोग करें - '_details' को' IList 'के बजाय 'सूची ' के रूप में घोषित किया गया है। 'सॉर्ट' केवल 'सूची ' पर घोषित किया गया है, न कि 'IList '। –

11

आप LINQ में OrderBy उपयोग करने के लिए सक्षम होना चाहिए ...

var sortedItems = myList.OrderBy(s => s); 
+1

नोट: जो 'IENumerable ' देता है और इन-प्लेस सॉर्ट नहीं है – abatishchev

1

List<T>.Sort() के साथ क्या गलत है?

LINQ बिना

: yourList.Sort();

LINQ के साथ

:

http://msdn.microsoft.com/en-us/library/3da4abas.aspx

+0

@goril - मैं इसका उपयोग करना चाहता हूं लेकिन मुझे एक त्रुटि मिलती है। यही वह है जिसे मैंने दूसरी टिप्पणी में जोड़ा। आशा है कि आप मदद कर सकते हैं - मेरी सूची इस तरह दिखती है: IList एनडी। मैंने nD.Sort() की कोशिश की लेकिन यह कहता है: प्रतीक 'सॉर्ट' को हल नहीं कर सकता। – Mariko

+1

@ मारिको: आप इंटरफ़ेस IList का उपयोग करते हैं जिसमें सॉर्ट विधि नहीं है। क्रमबद्ध सूची वैरिएबल सीधे। दूसरे शब्दों में आप अपने उदाहरण से '_details' को सॉर्ट कर सकते हैं लेकिन 'विवरण' –

14

वहाँ दो तरीके हैं yourList.OrderBy(x => x).ToList()

आप में अधिक जानकारी मिलेगी: http://www.dotnetperls.com/sort-string-array

+0

@Dminox नहीं - मेरी सूची इस तरह दिखती है: IList nD। मैंने nD.Sort() की कोशिश की लेकिन यह कहता है: प्रतीक 'सॉर्ट' को हल नहीं कर सकता। – Mariko

+1

@ मारिको 'सॉर्ट() 'सूची ' * नहीं * 'IList ' का सदस्य है। आप पूर्व में स्विच करने पर विचार कर सकते हैं (जब तक कि आप अलग-अलग 'IList ' कार्यान्वयन के साथ काम करने की अपेक्षा न करें।) – dlev

+0

सही उत्तर। –

11

एक और तरीका है

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
+5

इस किसी को किसी भी ऑब्जेक्ट को किसी एक के गुणों से क्रमबद्ध करने के लिए ** का अनुकूलन करने का लाभ ** है। – MGOwen

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