【问题标题】:sorting List<string[]> by many columns按多列排序 List<string[]>
【发布时间】:2013-06-09 11:43:41
【问题描述】:

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

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

我想过这样的算法:

  1. 删除与我不想用于排序的列对应的值
  2. 为剩下的每一列查找可用于存储其值的最长字符串
  3. 将每一行更改为字符串,其中每个单元格占用的字符数与给定列的值的最大字符数一样多
  4. 为每个字符串值分配 int 索引
  5. 对这些字符串值进行排序
  6. 借助已排序的索引对真实数据进行排序

但我认为这个算法很糟糕。如果可能的话,您能否建议我使用 C# 和 .NET 现有功能的更好方法?

【问题讨论】:

  • 只需调用OrderBy() 并委托查找比较对象。

标签: c# arrays list sorting


【解决方案1】:
List<string[]> list = .....

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

【讨论】:

  • 谢谢!这几乎正​​是我想要的。但是,我使用 string[] 因为我第一次知道列数是在执行期间。在您的解决方案中,它仅限于三列,并且应该更灵活一些(使用 i 列而不是 3 列)。有没有办法用这种方法实现它?问候!
  • 先使用var query = list.OrderBy(x =&gt; x[i]);,然后在运行时可以多次添加query = query.ThenBy(x =&gt; x[j]);
【解决方案2】:

类似这样的:

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;
});

【讨论】:

  • 当您进行第二次排序时,如问题中所问,您将失去第一次排序中的顺序。
  • @I4V,如果您在比较器中正确执行,则不会。您只需调用一次Sort,比较器将遍历要排序的列,返回第一个不返回零的比较结果..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2018-01-19
  • 2021-02-14
  • 2012-11-29
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多