सूची <टी> ऑर्डरबी वर्णमाला क्रम


442

मैं फ्रेमवर्क 3.5 पर C # का उपयोग कर रहा हूं। मैं जल्दी से एक जेनेरिक सॉर्ट करना चाह रहा हूं List<T>। इस उदाहरण के लिए, मान लें कि मेरे पास Personlastname की संपत्ति के साथ एक प्रकार की सूची है । मैं एक लंबर एक्सप्रेशन का उपयोग करके इस सूची को कैसे सॉर्ट करेगा?

List<Person> people = PopulateList();
people.OrderBy(???? => ?????)

जवाबों:


695

यदि आप इन-प्लेस सॉर्ट करते हैं (अर्थात सूची अपडेट की गई है):

people.Sort((x, y) => string.Compare(x.LastName, y.LastName));

यदि आप एक नई सूची का मतलब:

var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional

2
मेरा मानना ​​है कि पहला व्यक्ति बनना चाहता है। (x (y, y) => string.Compare (x.LastName, y.LastName) <0);
जेम्स कर्रान

36
@ नाम: मुझे ऐसा नहीं लगता। तुलना <T> इंट इंट, बूल नहीं।
जॉन स्कीट

2
मुझे आश्चर्य है कि यदि आप ऑर्डरबाय फर्स्टनाम और लास्टनाम चाहते हैं ... तो आपको क्या लिखना चाहिए?
balexandre

63
var newList = people.rderBy (x => x.FirstName) .ThenBy (x => x.LastName) .ToList ();
मार्क Gravell

4
@Faraz (एक्स, वाई) => x.price.CompareTo (y.price)
मार्क Gravell

98

क्या आपको सूची को जगह में क्रमबद्ध करने की जरूरत है, या सूची की सामग्री का सिर्फ एक क्रम दिया गया है? बाद आसान है:

var peopleInOrder = people.OrderBy(person => person.LastName);

जगह में छाँटने के लिए, आपको एक IComparer<Person>या एक की आवश्यकता होगी Comparison<Person>। उसके लिए, आप MiscUtilProjectionComparer में विचार कर सकते हैं ।

(मुझे पता है कि मैं MiscUtil को लाता रहता हूं - यह सिर्फ प्रासंगिक बना रहता है ...)


1
यह मेरे लिए काम करता है, लेकिन मैंने केवल ".ToList ()" के बाद: समकालीनों को आबद्ध किया है। BBBthYear = समकालीनों को।
बी क्ले शैनन

2
@ B.ClayShannon: वैसे तो आपको चाहिए कि अगर आप ए चाहते हैं List<T>, लेकिन अगर आपको सिर्फ इटरेट करना है तो आपको इसकी जरूरत नहीं है।
जॉन स्कीट

23

आप linq :) का उपयोग कर सकते हैं:

System.linq;
var newList = people.OrderBy(x=>x.Name).ToList();

23
people.OrderBy(person => person.lastname).ToList();

17
खैर, यह अभी भी परिणाम पर कब्जा नहीं करता है - आपको बाएं हाथ की ओर एक "सूची <व्यक्ति> लोग =" की आवश्यकता होगी ...
मार्क ग्रेवेल

8
यह उत्तर LINQ का उपयोग करते समय सबसे आम त्रुटि दर्शाता है - विधियाँ जैसे सूची को संशोधित OrderBy नहीं करती हैं , बल्कि नए "संग्रह" (आमतौर पर आलसी IEnumerable<T>) लौटाती हैं जिन्हें किसी चीज़ को सौंपा जाना चाहिए।
अलेक्सई लेवेनकोव

2
LINQ का उपयोग करते समय @AlexeiLevenkov आपको कैसे पता चलेगा कि यह सबसे आम त्रुटि है?
5

13
private void SortGridGenerico< T >(
          ref List< T > lista       
    , SortDirection sort
    , string propriedadeAOrdenar)
{

    if (!string.IsNullOrEmpty(propriedadeAOrdenar)
    && lista != null
    && lista.Count > 0)
    {

        Type t = lista[0].GetType();

        if (sort == SortDirection.Ascending)
        {

            lista = lista.OrderBy(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
        else
        {
            lista = lista.OrderByDescending(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
    }
}

5

मेरे लिए यह उपयोगी डमी गाइड - जेनेरिक सूची में छंटनी - काम किया। यह आपको इस काम को करने के लिए 4 तरीकों (अधिभार) को समझने में मदद करता है, बहुत ही पूर्ण और स्पष्ट स्पष्टीकरण और सरल उदाहरणों के साथ

  • सूची। ()
  • List.Sort (सामान्य तुलना)
  • List.Sort (जेनेरिक IComparer)
  • List.Sort (Int32, Int32, जेनेरिक IComparer)

5

आप इस कोड स्निपेट का उपयोग कर सकते हैं:

var New1 = EmpList.OrderBy(z => z.Age).ToList();

जहां New1एक है List<Employee>

EmpListका परिवर्तनशील है List<Employee>

zएक Employeeप्रकार का चर है ।


अंशुमन, एक varप्रकार का कुछ भी नहीं है । New1है List<Employee>और zहै Employee
नवफाल

5

आप भी उपयोग कर सकते हैं

model.People = model.People.OrderBy(x => x.Name).ToList();

4
हालांकि यह कोड नमूना प्रश्न का उत्तर दे सकता है, लेकिन इसमें स्पष्टीकरण का अभाव है। जैसा कि यह अब खड़ा है, यह कोई मूल्य नहीं जोड़ता है, और नीचे / हटाए जाने के परिवर्तन को खड़ा करता है। कृपया कुछ स्पष्टीकरण जोड़ें कि यह क्या है और क्यों यह ओपी की समस्या का समाधान है।
o

0

यह एक सामान्य सॉर्टर है। नीचे स्विच के साथ कहा जाता है।

DVm। पगपाइयर्स, इस मामले में टी टाइप के मेरे ViewModel पर एक संपत्ति है, T एक EF6 मॉडल वर्ग है, जिसे page_permission कहा जाता है।

DVm.UserNameSortDir अगली बार दिशा रखने वाले दृश्यमॉडल पर एक स्ट्रिंग प्रॉपर्टी है। एक है कि actaully दृश्य में प्रयोग किया जाता है।

switch (sortColumn)
{
    case "user_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.user_name, ref sortDir);
        dvm.UserNameSortDir = sortDir;
        break;
    case "role_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.role_name, ref sortDir);
        dvm.RoleNameSortDir = sortDir;
        break;
    case "page_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.page_name, ref sortDir);
        dvm.PageNameSortDir = sortDir;
        break;
}                 


public List<T> Sort<T,TKey>(List<T> list, Func<T, TKey> sorter, ref string direction)
    {
        if (direction == "asc")
        {
            list = list.OrderBy(sorter).ToList();
            direction = "desc";
        }
        else
        {
            list = list.OrderByDescending(sorter).ToList();
            direction = "asc";
        }
        return list;
    }

1
मुझे लगता है कि यह रास्ता बहुत जटिल है। जैसा कि आप अन्य उत्तरों में देख सकते हैं, यह सब एक ही पंक्ति में किया जा सकता है (इसका मतलब यह नहीं है कि इसे एक पंक्ति में करना अच्छा है, लेकिन मुझे इसे इस तरह से करने का लाभ नहीं मिलता है)
jalgames

यह AngularJS का उपयोग करते हुए मल्टी कॉलम सॉर्टिंग के लिए है। यह अनिवार्य रूप से सिंगल लाइन सॉर्टिंग है, लेकिन यह सॉर्ट डाइरेक्शन चर भी निर्धारित करता है। यदि आप इसे करीब से देखते हैं तो यह वास्तव में उतना जटिल नहीं है। मुझे लगता है कि सॉर्ट फ़ंक्शन सभी सामान्य सामानों के साथ थोड़ा डराने वाला है, लेकिन अगर मैंने उस परिभाषा को लिया है तो यह 1 लाइन सॉर्ट कॉल है।
हॉवर्स

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