que tiene un genéricouso propio IComparer <T> con LINQ OrdenarPor
List<MyClass>
donde MyClass
tiene una propiedad InvoiceNumber
que contiene valores como:
200906/1
200906/2
..
200906/10
200906/11
200906/12
Mi lista se une a una
BindingList<T>
que apoya la clasificación con 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;
}
Sin embargo las clases comparador predeterminado (como se suponía) como este:
200906/1
200906/10
200906/11
200906/1 2
200906/2
que es desagradable en este caso.
Ahora quiero usar mi propio IComparer<T>
con esto. Se ve así:
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]);
}
}
}
y cambió el código ApplySortCore
utilizar este IComparer
:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
Cuando puedo depurar mi código, veo que MyComparer.Compare(object, object)
se llama varias veces y devuelve los valores de la derecha (- 1, 0, 1) para un método de comparación.
Pero mi lista todavía se ordena de la manera "incorrecta". ¿Me estoy perdiendo de algo? No tengo ni idea.
Lo siento, el código shortend un poco. En mi código original, hago esto. Artículos = artículos; (Si no, no ordenaría de todos modos) Pero la conversión int funciona (debo haber estado ciego || estúpido para perder eso). Muchas gracias. –