484 votes

C# List<> OrderBy Ordre alphabétique

J'utilise C# sur Framework 3.5. Je cherche à trier rapidement une Liste générique<>. Dans le cadre de cet exemple, disons que j'ai une liste de type Personne avec une propriété de nom de famille. Comment trier cette liste à l'aide d'une expression lambda ?

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

744voto

Marc Gravell Points 482669

Si vous voulez dire un tri in-place (c'est-à-dire que la liste est mise à jour) :

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

Si vous voulez dire une nouvelle liste :

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

2 votes

Je crois que la première veut être people.Sort((x, y) => string.Compare(x.LastName, y.LastName) < 0) ;

36 votes

James : Je ne pense pas. Comparison<T> renvoie un int, pas un bool.

2 votes

Je me demande si vous voulez OrderBy Firstname and Lastname... que devez-vous écrire ?

107voto

Jon Skeet Points 692016

Avez-vous besoin que la liste soit triée sur place, ou simplement d'une séquence ordonnée du contenu de la liste ? Ce dernier cas est plus facile :

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

Pour faire le tri sur place, il faudrait une IComparer<Person> ou un Comparison<Person> . Pour cela, vous pouvez envisager ProjectionComparer sur MiscUtil .

(Je sais que je n'arrête pas de parler de MiscUtil - c'est toujours d'actualité...)

1 votes

Cela a fonctionné pour moi, mais seulement après avoir ajouté ".ToList()" : contemporariesOrderedByBirthYear = contemporaries.OrderBy(contemp => contemp.BirthYear).ToList() ;

2 votes

@B.ClayShannon : Eh bien, vous en avez besoin si vous voulez une List<T> mais vous n'en avez pas besoin si vous voulez simplement itérer.

27voto

Danimal Points 5721
people.OrderBy(person => person.lastname).ToList();

18 votes

Eh bien, cela ne capture toujours pas le résultat - vous auriez besoin d'une "List<Person> people = " sur le côté gauche...

9 votes

Cette réponse démontre l'erreur la plus courante lors de l'utilisation de LINQ - les méthodes comme OrderBy ne pas modifier la liste, mais plutôt retourner une nouvelle "collection" (généralement paresseuse). IEnumerable<T> ) qui doivent être affectés à quelque chose.

2 votes

@AlexeiLevenkov comment savez-vous que c'est l'erreur la plus courante lors de l'utilisation de LINQ ?

25voto

vampire203 Points 181

vous pouvez utiliser linq :) en utilisant :

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

15voto

Bruno Points 81
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();
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X