1

多くの列で並べ替えたいリストがあります。たとえば、string[] には 5 つの要素 (5 列) があり、List には 10 の要素 (10 行) があります。たとえば、1 列目、3 列目、4 列目で並べ替えを開始したいとします。

C# で最も簡単な方法で行うにはどうすればよいでしょうか?

私はそのようなアルゴリズムについて考えました:

  1. 並べ替えに使用したくない列に対応する値を削除します
  2. 残っている列のそれぞれについて、その値を格納するために使用できる最長の文字列を見つけます
  3. 各行を文字列に変更します。各セルは、指定された列の値の最大文字数と同じ数の文字を占有します
  4. これらの文字列値のそれぞれにインデックスを使用して int を割り当てます
  5. これらの文字列値を並べ替えます
  6. すでにソートされたインデックスを使用して、実際のデータをソートします

しかし、このアルゴリズムは非常に悪いと思います。可能であれば、C# と .NET の既存の機能を使用するより良い方法を教えてください。

4

2 に答える 2

5
List<string[]> list = .....

var newList = list.OrderBy(x => x[1]).ThenBy(x => x[3]).ThenBy(x => x[4]).ToList();
于 2013-06-09T11:47:02.343 に答える
0

このようなもの:

var rows = new List<string[]>();

var sortColumnIndex = 2;

rows.Sort((a, b) => return a[sortColumnIndex].CompareTo(b[sortColumnIndex]));

これにより、その場での並べ替えが実行されます。つまり、リストの内容が並べ替えられます。

複数の列での並べ替えは可能ですが、比較デリゲートにさらにロジックが必要です。

別のコレクションを作成してもよければ、別の回答で提供されている Linq アプローチを使用できます。


編集ここに複数列のインプレースソートの例があります:

var rows = new List<string[]>();

var sortColumnIndices = new[] { 1, 3, 4 };

rows.Sort((a, b) => {
    for (var index in sortColumnIndices)
    {
        var result = a[index].CompareTo(b[index]);
        if (result != 0)
            return result;
    }
    return 0;
});
于 2013-06-09T11:45:57.657 に答える