Liste <T> OrderBy Alphabetical Order


442

Ich verwende C # unter Framework 3.5. Ich suche schnell ein Generikum zu sortieren List<T>. PersonNehmen wir für dieses Beispiel an, ich habe eine Liste eines Typs mit der Eigenschaft Nachname. Wie würde ich diese Liste mit einem Lambda-Ausdruck sortieren?

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

Antworten:


695

Wenn Sie eine In-Place-Sortierung meinen (dh die Liste wird aktualisiert):

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

Wenn Sie eine neue Liste meinen:

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

2
Ich glaube, dass man zuerst Menschen sein möchte.Sort ((x, y) => string.Compare (x.LastName, y.LastName) <0);
James Curran

36
@ James: Das würde ich nicht denken. Vergleich <T> gibt int zurück, nicht bool.
Jon Skeet

2
Ich frage mich, ob Sie nach Vor- und Nachnamen bestellen möchten ... was sollten Sie schreiben?
Balexandre

63
var newList = people.OrderBy (x => x.FirstName) .ThenBy (x => x.LastName) .ToList ();
Marc Gravell

4
@ Faraz (x, y) => x.price.CompareTo (y.price)
Marc Gravell

98

Müssen Sie die Liste an Ort und Stelle sortieren oder nur eine geordnete Reihenfolge des Inhalts der Liste? Letzteres ist einfacher:

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

Zum Sortieren benötigen Sie ein IComparer<Person>oder ein Comparison<Person>. Dafür möchten Sie vielleicht ProjectionComparerin MiscUtil berücksichtigen .

(Ich weiß, dass ich MiscUtil immer wieder anspreche - es ist einfach immer relevant ...)


1
Dies funktionierte für mich, aber erst nachdem ich ".ToList ()" angehängt hatte: contemporariesOrderedByBirthYear = contemporaries.OrderBy (contemp => contemp.BirthYear) .ToList ();
B. Clay Shannon

2
@ B.ClayShannon: Nun, das brauchst du, wenn du ein willst List<T>, aber du brauchst es nicht, wenn du nur iterieren willst.
Jon Skeet

23

Sie können linq verwenden :) mit:

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

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

17
Nun, das erfasst das Ergebnis immer noch nicht - Sie benötigen eine "List <Person> people =" auf der linken Seite ...
Marc Gravell

8
Diese Antwort zeigt den häufigsten Fehler bei der Verwendung von LINQ - Methoden wie " Liste OrderBy nicht ändern", sondern neue "Sammlung" (normalerweise faul IEnumerable<T>) zurückgeben, die etwas zugewiesen werden muss.
Alexei Levenkov

2
@AlexeiLevenkov Woher wissen Sie, dass dies der häufigste Fehler bei der Verwendung von LINQ ist?
Tymtam

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

Für mich hat diese nützliche Dummy-Anleitung - Sortieren in generischer Liste - funktioniert. Es hilft Ihnen, 4 Möglichkeiten (Überlastungen) zu verstehen, um diese Aufgabe mit sehr vollständigen und klaren Erklärungen und einfachen Beispielen zu erledigen

  • List.Sort ()
  • List.Sort (generischer Vergleich)
  • List.Sort (generischer IComparer)
  • List.Sort (Int32, Int32, Generic IComparer)

5

Sie können dieses Code-Snippet verwenden:

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

wo New1ist ein List<Employee>.

EmpListist variabel von a List<Employee>.

zist eine Variable vom EmployeeTyp.


AnshuMan, es gibt nichts Schöneres als einen varTyp. New1ist List<Employee>und zist Employee.
Nawfal

5

Sie können auch verwenden

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

4
Dieses Codebeispiel beantwortet möglicherweise die Frage, es fehlt jedoch eine Erklärung. So wie es jetzt ist, fügt es keinen Wert hinzu und steht für die Änderung der Herabstufung / Löschung. Bitte fügen Sie eine Erklärung hinzu, was funktioniert und warum es eine Lösung für das Problem des OP ist.
2.

0

Dies ist ein generischer Sortierer. Wird mit dem Schalter unten aufgerufen.

dvm.PagePermissions ist eine Eigenschaft in meinem ViewModel vom Typ List T, in diesem Fall ist T eine EF6-Modellklasse mit dem Namen page_permission.

dvm.UserNameSortDir ist eine Zeichenfolgeeigenschaft im Ansichtsmodell, die die nächste Sortierrichtung enthält. Diejenige, die tatsächlich in der Ansicht verwendet wird.

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
Ich denke, das ist viel zu kompliziert. Wie Sie in den anderen Antworten sehen können, kann alles in einer einzigen Zeile erledigt werden (das bedeutet nicht unbedingt, dass es gut ist, es in einer einzigen Zeile zu tun, aber ich habe nicht den Vorteil, es so zu machen)
Jalgames

Dies ist für die mehrspaltige Sortierung mit AngularJS vorgesehen. Es handelt sich im Wesentlichen um die Einzeilensortierung, es wird jedoch auch die Sortierrichtungsvariable festgelegt. Es ist wirklich nicht so komplex, wenn man es genau betrachtet. Ich denke, die Sortierfunktion ist ein wenig einschüchternd bei all den allgemeinen Dingen, aber wenn ich diese Definition herausgenommen habe, ist es ein 1-zeiliger Sortieraufruf.
Howserss

Zu kompliziert für das, was die Operation verlangte. Es ist jedoch eine gute Lösung für ein anderes Problem.
rollt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.