एक सूची को वर्णानुक्रम में क्रमबद्ध करें


83

मेरे पास निम्न वर्ग है:

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

वर्तमान में मैं निम्न का उपयोग करके कक्षा को क्रमबद्ध करता हूं:

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;
    }
}

मैं क्या करना चाहूंगा विवरणों की सामग्री को वर्णमाला क्रम में क्रमबद्ध करना है।

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

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

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

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

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

जवाबों:


155

आप केवल कॉल करके किसी सूची को इन-प्लेस कर सकते हैं List<T>.Sort:

list.Sort();

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

संपादित करें: ध्यान दें कि आपके कोड में, आपको आवश्यकता होगी

_details.Sort();

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

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

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


इसलिए यदि मैं आपके द्वारा बनाई गई सूची को क्रमबद्ध करना चाहता था तो क्या मुझे केवल कहने की आवश्यकता होगी: SortedList.Sort?
Mariko

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

@ मारिको: _details.Sort()इसके बजाय उपयोग करें - जैसा _detailsकि इसके बजाय घोषित किया गया List<string>है IList<string>Sortकेवल पर घोषित किया जाता है List<T>, नहीं IList<T>
जॉन स्कीट

25

इसके दो तरीके हैं:

LINQ के बिना: yourList.Sort();

LINQ के साथ: yourList.OrderBy(x => x).ToList()

आपको अधिक जानकारी इसमें मिलेगी: https://www.dotnetperls.com/sort


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

1
@ मारिको न केSort() सदस्य List<T> हैं IList<T> । आप पूर्व पर स्विच करने पर विचार कर सकते हैं (जब तक कि आप अलग-अलग IList<T>कार्यान्वयन के साथ काम करने की उम्मीद नहीं करते हैं ।)
08

24

दूसरा रास्ता

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

10
यह एक गुण के किसी भी वस्तु को छाँटने के लिए आदत डालने का लाभ है ।
MGOwen


1

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

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.sort#overloads


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

1
@Mariko: आप इंटरफ़ेस IList <T> का उपयोग करते हैं जिसमें सॉर्ट विधि नहीं है। क्रमबद्ध सूची <T> चर सीधे। दूसरे शब्दों में आप सॉर्ट कर सकते हैं _detailsअपने उदाहरण से नहीं बल्किDetails
ओलेग Dudnyk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.