【问题标题】:How can I sort a 2d array using Linq?如何使用 Linq 对二维数组进行排序?
【发布时间】:2011-10-27 23:48:28
【问题描述】:

我有一个二维字符串数组

string [] [] myArray;

我想按其中一列对其进行排序。

所以数据可能是

{ "Apple", "2", "Bob" },
{ "Banana", "1", "Fred" }

我想按这些列中的任何一个对其进行排序 - 我会有一个索引。

理想情况下,我想做myArray.Sort(1);之类的事情

我知道我可能必须使用自定义比较器。我认为这是一个有趣的学习机会。谁能给点建议?

【问题讨论】:

  • 你怎么能有一个带有这些字符串的二维锯齿状数组?它们似乎是 3 个字段(其中 1 个是整数)
  • 这是一个数组数组...所以 myArray[0] = ["Apple", "2", "Bob"];即 myArray[0, 0] 是 Apple,0,1 是“2”,等等

标签: c# linq


【解决方案1】:
var myOrderedRows = myArray.OrderBy(row => row[columnIndex]);

【讨论】:

  • 它最后不是一个数组 :-) 它是一个IOrderedEnumerable。添加ToArray()
  • 我重命名变量你满意吗? ;)
  • 是的,我正在输入相同的答案,但聚会迟到了 :-) data = data.OrderBy(sub => sub[columnIndex]).ToArray();
  • 太好了,谢谢 - 我原以为这需要几个小时才能完成。
  • 即使您必须手动对其进行排序——您也需要“几个小时”来实现冒泡排序? ;p
【解决方案2】:
Array.Sort(myArray, (p, q) => p[0].CompareTo(q[0]));

这将对数组进行排序(所以最后myArray 将被排序)。 LINQ OrderBy 相比之下会创建一个新的有序枚举,然后您可以将其转换为 ToArray

【讨论】:

  • 谢谢,这对了解很有用
【解决方案3】:

你可以这样做......

IEnumerable<T> AsEnumerable(this T[,] arr) {
  for(int i = 0; i < arr.GetLength(0); i++)
    for(int j = 0; j < arr.GetLength(1); j++)
      yield return arr[i, j];
}

然后写例如:

int[,] data = // get data somwhere
// After 'AsEnumerable' you can use all standard LINQ operations
var res = data.AsEnumerable().OrderBy(n => n).Reverse();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 2019-04-14
    • 2013-08-17
    • 2015-09-17
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多