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
Utilisez ThenBy
:
Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)
Voir MSDN: http://msdn.Microsoft.com/en-us/library/bb549422.aspx
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);
});
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();
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.