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(???? => ?????)
SaaS-Entwickler
quelle

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
Marc Gravell
quelle
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 ...)

Jon Skeet
quelle
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();
vampire203
quelle
23
people.OrderBy(person => person.lastname).ToList();
Danimal
quelle
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();
        }
    }
}
Bruno
quelle
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)
Iman
quelle
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 SrivAstav
quelle
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();
rosselder83
quelle
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;
    }
howserss
quelle
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