J'ai unutilisation propre IComparer <T> avec Linq OrderBy
List<MyClass>
générique où MyClass
possède une propriété InvoiceNumber
qui contient des valeurs telles que:
200906/1
200906/2
..
200906/10
200906/11
200906/12
Ma liste est liée à un
BindingList<T>
qui prend en charge le tri avec LINQ:
protected override void ApplySortCore(
PropertyDescriptor property, ListSortDirection direction)
{
_sortProperty = property;
_sortDirection = direction;
var items = this.Items;
switch (direction)
{
case ListSortDirection.Ascending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
case ListSortDirection.Descending:
items = items.OrderByDescending(x => property.GetValue(x)).ToList();
break;
}
this.Items = items;
}
Cependant, les types de comparateur par défaut (comme on le suppose) comme celui-ci:
200906/1
200906/10
200906/11
200906/1 2
200906/2
qui est méchant dans ce cas. Je veux maintenant utiliser mon propre IComparer<T>
avec ceci. Il ressemble à ceci:
public class MyComparer : IComparer<Object>
{
public int Compare(Object stringA, Object stringB)
{
String[] valueA = stringA.ToString().Split('/');
String[] valueB = stringB.ToString().Split('/');
if(valueA .Length != 2 || valueB .Length != 2)
return String.Compare(stringA.ToString(), stringB.ToString());
if (valueA[0] == valueB[0])
{
return String.Compare(valueA[1], valueB[1]);
}
else
{
return String.Compare(valueA[0], valueB[0]);
}
}
}
et a changé le code ApplySortCore
utiliser cette IComparer
:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
Quand je déboguer mon code, je vois que MyComparer.Compare(object, object)
est appelé plusieurs fois et renvoie les bonnes valeurs (- 1, 0, 1) pour une méthode de comparaison.
Mais ma liste est toujours triée de la "mauvaise" manière. Est-ce que je manque quelque chose? Je n'ai aucune idée.
Désolé, je le code raccourci dans un peu. Dans mon code d'origine, je fais ceci.Items = items; (Sinon, il ne trierait pas de toute façon) Mais la conversion int fonctionne (j'ai dû être aveugle || stupide de manquer ça). Merci beaucoup. –