如何对矩阵列值进行排序然后对行进行排序?

时间:2017-07-05 13:44:49

标签: c# linq

例如这个矩阵:

3 2
2 2
1 2

这是错误的:

IEnumerable<IEnumerable<int>> inputRows = ...;

必须成为:

1 2
2 2
2 3

所以,所有最大的数字将集中在右下角。 首先,我需要对列号(不是整列)进行排序,这很容易做到:

var result = inputRows.Select(x=> x.OrderBy(y=>y));

此步骤后矩阵将变为:

2 3
2 2
1 2

但是如何使用LINQ整理整行?

PS 我对固定阵列解决方案不感兴趣。

2 个答案:

答案 0 :(得分:3)

您需要一个行比较器。我们要记住,所有行都有相同的长度:

public class RowComparer : IComparer<IEnumerable<int>>
{
    public int Compare(IEnumerable<int> x, IEnumerable<int> y)
    {
        // TODO: throw ArgumentNullException 
        return x.Zip(y, (xItem, yItem) => xItem.CompareTo(yItem))
                .Where(c => c != 0).FirstOrDefault();
    }
}

并将其用于分类:

inputRows.Select(r => r.OrderBy(x => x)).OrderBy(r => r, new RowComparer())

样品的输出:

[
  [ 1, 2 ],
  [ 2, 2 ],
  [ 2, 3 ]
]

答案 1 :(得分:-1)

也许这个?

var result = inputRows.Select(row => row.OrderBy(col => col)).OrderBy(row => row.Sum());

目前尚不清楚您希望订单行:整行还是每个单元格?