4

一般的なリストにアイテムのリストがあります:

  • A1 (ソート インデックス 1)
  • A2 (ソート インデックス 2)
  • B1 (ソート インデックス 3)
  • B2 (ソート インデックス 3)
  • B3 (ソート インデックス 3)

それらのコンパレータは次の形式を取ります。

this.sortIndex.CompareTo(other.sortIndex)

アイテムのリストで List.Sort() を実行すると、次の順序が得られます。

  • A1
  • A2
  • B3
  • B2
  • B1

並べ替えインデックスが正しい順序になっているという意味では明らかに機能していますが、「B」項目の順序を変更したくありません。

これを修正するためにコンパレーターを微調整することはできますか?

4

5 に答える 5

5

位置の変更に等しいアイテムが必要ない場合は、「安定ソート」アルゴリズムを使用する必要があります。

安定したソート アルゴリズムの例については、 「マージ ソート」を参照してください。C# での実装を次に示します。

于 2010-04-20T10:30:15.910 に答える
5

OrderBy等しい項目の順序を保持します:

myList = myList.OrderBy(item => item.SortIndex).ToList();
于 2010-04-20T10:34:09.373 に答える
2

StableSort()の拡張方法List<T>こちら

于 2012-05-04T13:36:47.167 に答える
1

コンパレータを変更して、値に対して二次ソートを行うことができます。

if (this.sortIndex.CompareTo(other.sortIndex) == 0) // same sortIndex
{
   return this.Value.CompareTo(other.Value);
}
return 0;
于 2010-04-20T10:33:52.853 に答える
1

Sort は QuickSort を使用しており、比較が等しい場合、元の順序は保証されません。

それでも List.Sort を使用したい場合は、次のような元のインデックスとの 2 番目の比較を追加できます。

int c = this.sortIndex.CompareTo(other.sortIndex);
if (c == 0)
  c = this.originalIndex.CompareTo(other.originalIndex);
return c;

それ以外の場合は、他の「安定した」アルゴリズム (LINQ OrderBy など) で並べ替えることができます。

于 2010-04-20T10:36:34.283 に答える