मैं जेनेरिक सूची DESC और ASC को कैसे सॉर्ट कर सकता हूं?


110

मैं जेनेरिक सूची DESC और ASC को कैसे सॉर्ट कर सकता हूं? LINQ के साथ और LINQ के बिना? मैं VS2008 का उपयोग कर रहा हूं।

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

जवाबों:


246

लिनक के साथ

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

लिनक के बिना

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

ध्यान दें कि Linq के बिना, सूची को ही हल किया जा रहा है। Linq के साथ, आपको सूची का आदेश दिया हुआ नामांकित होना चाहिए लेकिन सूची स्वयं नहीं बदली गई है। यदि आप सूची को बदलना चाहते हैं, तो आप Linq के तरीकों को कुछ इस तरह से बदल देंगे

li = li.OrderBy(i => i).ToList();

1
@onedaywhen यदि आपको लगता है कि किसी अन्य उपयोगकर्ता का उत्तर गलत है, तो आपको टिप्पणी करना, मतदान करना और / या आपको जो उत्तर महसूस हो रहा है उसे प्रदान करना सही है, किसी अन्य व्यक्ति के उत्तर को संपादित नहीं करना, जो आपको लगता है कि सही है।
Servy

24
मुझे लगता है कि अवरोही क्रम के लिए यहां उपयोग किए li.Sort((a, b) => b.CompareTo(a));गए -1*दृष्टिकोण की तुलना में उपयोग करना बहुत स्पष्ट है। मैंने तदनुसार उत्तर संपादित किया लेकिन @ सरवी ने इसे वापस ले लिया।
onedaywhen

9
@onedaywhen जब लेखक ने यह लिखने में गलती की कि वे क्या चाहते हैं, तो यह बदलकर कि वे जो लिखना चाहते हैं वह ठीक है। कोड रूप बदलना किसी और ने क्या सोचा था कि समाधान एक अलग दृष्टिकोण का उपयोग करना चाहिए जो आपको लगता है कि इसके बजाय उपयोग किया जाना चाहिए एक उपयुक्त संपादन नहीं है।
शाम

5
@onedaywhen ज़रूर; आप इसे कहीं भी देख सकते हैं, आपको वर्णित संपादन दिखाई देगा। सहायता केंद्र से, "मुझे पदों को कब संपादित करना चाहिए? [...] पोस्ट का अर्थ स्पष्ट करने के लिए (बिना इसका अर्थ बदले)"
सर्व

4
या बस -a.CompareTo(b)
शिम्मी वेइटहैंडलर

72

बिना Linq:

आरोही:

li.Sort();

अवरोही:

li.Sort();
li.Reverse();

Sort()एक शून्य विधि है, इसलिए आप Reverse()इसे इस तरीके से श्रृंखलाबद्ध नहीं कर सकते । आपको 2 अलग-अलग ऑपरेशन की आवश्यकता होगी। हालाँकि, LINQ के साथ आप इसे चेन कर सकते हैं OrderByलेकिन उस समय आपको OrderByDescendingइसके बजाय उपयोग करना चाहिए ।
अहमद मगेद


3

मैं ऊपर दिए गए सभी उत्तर की जाँच कर रहा था और एक अतिरिक्त जानकारी जोड़ना चाहता था। मैं सूची को DESC क्रम में क्रमबद्ध करना चाहता था और मैं उस समाधान की खोज कर रहा था जो कि बड़े इनपुट के लिए तेज़ हो और मैं पहले इस विधि का उपयोग कर रहा था: -

li.Sort();
li.Reverse();

लेकिन मेरे परीक्षण के मामले समय सीमा से अधिक होने में विफल रहे थे, इसलिए नीचे दिए गए समाधान ने मेरे लिए काम किया: -

li.Sort((a, b) => b.CompareTo(a));

तो अंततः निष्कर्ष यह है कि अवरोही क्रम में क्रमबद्ध सूची का दूसरा तरीका पिछले एक की तुलना में थोड़ा तेज है।


-3

अवरोही क्रम में अंतर मूल्यों के साथ सूची को क्रमबद्ध करने का बहुत सरल तरीका:

li.Sort((a,b)=> b-a);

आशा है कि यह मदद करता है!


4
यह वह नहीं है जो int.CompareTo(int)एक कारण से दरवाजा करता है। रेफरेंस source.microsoft.com पर स्रोत देखें जो कहता है: " तुलना करने की आवश्यकता है क्योंकि घटाव बहुत बड़ी नकारात्मक संख्याओं आदि के लिए सकारात्मक से लिपटेगा "। यदि आपके पास b = int.MinValueऔर a = 1(कहना) है, तो यह विफल हो जाएगा। कभी-कभी एक विधि कॉल इसके लायक है।
वाई हा ली

सवाल जेनेरिक सूचियों की छंटाई के बारे में कहते हैं। "-" ऑपरेशन कई प्रकारों के लिए भी संकलित नहीं होगा। और प्रकार के संकलित सेट के लिए आपके पास संख्यात्मक अतिप्रवाह त्रुटि हो सकती है जैसा कि टिप्पणी में उल्लेख किया गया है
वादिम लेवकोवस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.