按列<string []>排序<string []> </string []>

时间:2013-06-09 11:43:42

标签: c# arrays list sorting

我有列表,我想按多列排序。例如,string []有5个元素(5列),List有10个元素(10行)。例如,我想开始按第1列排序,然后按第3列排序,然后按第4列排序。

如何用C#以最简单的方式完成?

我想到了这样的算法:

  1. 删除与我不想用于排序的列相对应的值
  2. 查找剩下的每个列,可用于存储其值的最长字符串
  3. 将每一行更改为字符串,其中每个单元格占用的字符数与给定列的值的最大字符数一样多
  4. 为每个字符串值
  5. 分配i​​nt以及索引
  6. 对这些字符串值进行排序
  7. 借助已排序的索引对实际数据进行排序
  8. 但我认为这个算法非常糟糕。如果可能的话,你能否建议我使用C#和.NET已有的功能?

2 个答案:

答案 0 :(得分:5)

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

var newList = list.OrderBy(x => x[1]).ThenBy(x => x[3]).ThenBy(x => x[4]).ToList();

答案 1 :(得分: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;
});