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 回答