安定ソートを使用するようにSortableBindingListを変更する方法の例があります。ただし、SortableBindingListの更新バージョンがあります。安定ソートを使用するためにこの新しいバージョンを変更する最良の方法は何ですか?SortableBindingListにフラグを設定して、SortableBindingListのユーザーが、(遅い)安定した並べ替えと(速い)デフォルトの並べ替えのどちらを使用するかを決定できるようにしたいと思います。
ありがとう
安定ソートを使用するようにSortableBindingListを変更する方法の例があります。ただし、SortableBindingListの更新バージョンがあります。安定ソートを使用するためにこの新しいバージョンを変更する最良の方法は何ですか?SortableBindingListにフラグを設定して、SortableBindingListのユーザーが、(遅い)安定した並べ替えと(速い)デフォルトの並べ替えのどちらを使用するかを決定できるようにしたいと思います。
ありがとう
この問題は、次の安定ソート拡張メソッドを作成することで解決できますList<T>
。
public static class ListExtensions
{
public static void StableSort<T>(this List<T> list, IComparer<T> comparer)
{
var pairs = list.Select((value, index) => Tuple.Create(value, index)).ToList();
pairs.Sort((x, y) =>
{
int result = comparer.Compare(x.Item1, y.Item1);
return result != 0 ? result : x.Item2 - y.Item2;
});
list.Clear();
list.AddRange(pairs.Select(key => key.Item1));
}
}
次に、新しいバージョンの次のSortableBindingList
行を変更します。
itemsList.Sort(comparer);
に:
itemsList.StableSort(comparer);
これは、リスト内のアイテム インデックスのセカンダリ キーで補足された不安定な並べ替えを使用することで機能します。このバージョンは、病的に遅い挿入ソートを使用して安定したソートを実現していないため、一般的な使用には十分な速さであるはずです。