web-dev-qa-db-fra.com

Commander une liste (C #) par plusieurs champs?

Je souhaite commander une liste d'objets en C # par plusieurs champs, pas seulement par un. Par exemple, supposons que j'ai une classe appelée X avec deux attributs, A et B, et que j'ai les objets suivants, dans cet ordre:

objet1 => A = "a", B = "h"
object2 => A = "a", B = "c"
object3 => A = "b", B = "x"
objet4 => A = "b", B = "b"

et je veux d'abord classer la liste par un attribut A, et quand ils sont égaux, par élément B, l'ordre serait donc:

"a" "c"
"a" "h"
"b" "b"
"b" "x"

Pour autant que je sache, la méthode OrderBy commande par un paramètre.

Question: Comment puis-je commander une liste C # par plusieurs champs?

Merci beaucoup

89
Esabe

Utilisez ThenBy:

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

Voir MSDN: http://msdn.Microsoft.com/en-us/library/bb549422.aspx

254
David Neale

Oui, vous pouvez le faire en spécifiant la méthode de comparaison. L'avantage est que l'objet trié ne doit pas nécessairement être IComparable

   aListOfObjects.Sort((x, y) =>
   {
       int result = x.A.CompareTo(y.A);
       return result != 0 ? result : x.B.CompareTo(y.B);
   });
32
CMinus

Faites de votre objet quelque chose comme

public class MyObject : IComparable
{
    public string a;
    public string b;

    virtual public int CompareTo(object obj)
    {
        if (obj is MyObject)
        {
            var compareObj = (MyObject)obj;
            if (this.a.CompareTo(compareObj.a) == 0)
            {
                // compare second value
                return this.b.CompareTo(compareObj.b);
            }
            return this.a.CompareTo(compareObj.b);
        }
        else
        {
            throw new ArgumentException("Object is not a MyObject ");
        }
    }
}

notez également que les retours pour CompareTo:

http://msdn.Microsoft.com/en-us/library/system.icomparable.compareto.aspx

Ensuite, si vous avez une liste de MyObject, appelez .Sort () c'est-à-dire

var objList = new List<MyObject>();
objList.Sort();
8
Jason Jong

Votre objet doit implémenter l'interface IComparable .

Avec cela, votre classe devient une nouvelle fonction appelée CompareTo(T other). Dans cette fonction, vous pouvez effectuer toute comparaison entre l'objet actuel et l'autre objet et renvoyer une valeur entière si le premier est supérieur, inférieur ou égal au second.

0
Oliver