Ho un genericouso proprio IComparer <T> con LINQ OrderBy
List<MyClass>
dove MyClass
ha una proprietà InvoiceNumber
che contiene valori quali:
200906/1
200906/2
..
200906/10
200906/12
mia lista è legato ad un
BindingList<T>
che supporta la selezione 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;
}
Tuttavia i tipi di default Comparer (come supposto) come questo:
200906/1
200906/10
200906/11
200906/1 2
che è brutto in questo caso.
Ora voglio usare il mio IComparer<T>
con questo. Ecco come si presenta:
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]);
}
}
}
e ha cambiato il codice ApplySortCore
di utilizzare questo IComparer
:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
Quando metto a punto il mio codice, vedo che MyComparer.Compare(object, object)
è chiamato più volte e restituisce i valori giusti (- 1, 0, 1) per un metodo di confronto.
Ma la mia lista è ancora ordinata in modo "sbagliato". Mi sto perdendo qualcosa? Non ho idea.
Mi dispiace, ho shortend il codice un po. Nel mio codice originale faccio questo.Items = items; (Se no non sarebbe in ogni caso in ordine) Ma int lavori di conversione (devo essere stato cieco || stupido a mancarlo). Grazie mille. –