C# 如何对矩阵列值排序,然后对行排序?

C# 如何对矩阵列值排序,然后对行排序?,c#,linq,C#,Linq,例如,该矩阵: 3 2 2 2 1 2 写为: IEnumerable<IEnumerable<int>> inputRows = ...; 所以,所有最大的数字将集中在右下角。 首先,我需要对列编号进行排序,而不是对整个列进行排序,这很容易做到: var result = inputRows.Select(x=> x.OrderBy(y=>y)); 在此步骤之后,矩阵将变为: 2 3 2 2 1 2 但是如何使用LINQ对整行进行排序 PS我对固定阵

例如,该矩阵:

3 2
2 2
1 2
写为:

IEnumerable<IEnumerable<int>> inputRows = ...;
所以,所有最大的数字将集中在右下角。 首先,我需要对列编号进行排序,而不是对整个列进行排序,这很容易做到:

var result = inputRows.Select(x=> x.OrderBy(y=>y));
在此步骤之后,矩阵将变为:

2 3
2 2
1 2
但是如何使用LINQ对整行进行排序


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

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

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();
    }
}
样本的输出:

[
  [ 1, 2 ],
  [ 2, 2 ],
  [ 2, 3 ]
]
也许是这个

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

不清楚您希望如何对行进行排序:按整行还是按每个单元格?

为什么选择LINQ?我会将数组设置为col1、col2等,以将它们分开,对列进行排序,然后将它们重新组合在一起。定义矩阵您可以使用OrderBy的重载,该重载接受一个ICompare并传入一个,该重载将比较两个IEnumerable行中的每个值进行比较,直到找到差异。等等,您的数据看起来像是每行中的值被排序,然后是排序的行,这只是巧合吗?还是您只是希望所有值都被排序?基本上{{5,1},{3,2}应该排序为{1,5},{2,3}或{1,2},{3,5}?@eocron您应该扩展您的输入和输出,因为目前还不清楚您要求的是什么。在这种情况下,您的解决方案将无效:它将输出:@eocron可能指定要求,而不是仅指定预期的输出。您不能仅对值求和。您必须比较第一个值,如果它们相同,则比较下一个值,依此类推。@EpicKip-Umm,我已经指定所有最大的数字都应该在右下角?@eocron,这意味着排序后的左边数字是2中的较小值,与行排序无关>?这对于说明想法很有用,我认为这是OP想要的,但在澄清之后,他们实际上想要不同的东西。数据也恰好以这种方式正确排序。事实上,我不确定OP想要什么,因为他们在对其他问题的评论中自相矛盾。显然,这就是OP想要的。继续,谢谢,这就是我要找的=
[
  [ 1, 2 ],
  [ 2, 2 ],
  [ 2, 3 ]
]
var result = inputRows.Select(row => row.OrderBy(col => col)).OrderBy(row => row.Sum());