私はジェネリックを持っています
List<MyClass>
where には、次のような値を含むMyClass
プロパティがあります。InvoiceNumber
200906/1
200906/2
..
200906/10
200906/11
200906/12
私のリストはにバインドされています
BindingList<T>
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;
}
ただし、デフォルトの比較子は (想定どおり) 次のように並べ替えます。
200906/1
200906/10
200906/11
200906/12
200906/2
この場合、これは厄介です。
今、私はこれで自分のものを使いたいと思っていますIComparer<T>
。次のようになります。
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]);
}
}
}
ApplySortCore
これを使用するようにコードを変更しましたIComparer
:
case ListSortDirection.Ascending:
MyComparer comparer = new MyComparer();
items = items.OrderByDescending(
x => property.GetValue(x), comparer).ToList();
break;
コードをデバッグすると、MyComparer.Compare(object, object)
が複数回呼び出され、compare メソッドに対して正しい値 (-1、0、1) が返されることがわかります。
しかし、私のリストはまだ「間違った」方法でソートされています。何か不足していますか?私は見当もつかない。