在C#中动态排序2对象[,],如果太难则不排序

在C#中动态排序2对象[,],如果太难则不排序,c#,arrays,sorting,epplus,C#,Arrays,Sorting,Epplus,我希望能够对两列上的二维数组进行排序。我已经设法在一列上使用 本例中的Orderedby行在第1列上排序。我想在第1列和第4列进行排序 我致力于使用EPPlus阅读一个非常大的电子表格,不幸的是,它不支持排序 谢谢大家,要对多列进行排序,我们可以使用ThenBy/ThenByDescending,后跟orderby,请参阅下面的示例 myArray.OrderBy(x => x[1]).ThenBy(x => x[2]); 最简单的方法是调用OrderBy扩展方法两次。由于lin

我希望能够对两列上的二维数组进行排序。我已经设法在一列上使用

本例中的Orderedby行在第1列上排序。我想在第1列和第4列进行排序

我致力于使用EPPlus阅读一个非常大的电子表格,不幸的是,它不支持排序


谢谢大家,

要对多列进行排序,我们可以使用ThenBy/ThenByDescending,后跟orderby,请参阅下面的示例

myArray.OrderBy(x => x[1]).ThenBy(x => x[2]);

最简单的方法是调用
OrderBy
扩展方法两次。由于linq使用稳定的排序算法,因此对于在第二次调用中具有相等值的元素,第一次调用后的元素顺序将保持不变

matrix.OrderBy(r => r[4]).OrderBy(r => r[1]);
请注意,对于这一点,您需要按照与通常相反的顺序进行排序:对于(一维)可枚举项,您更希望将其写成
matrix.OrderBy(r=>r[1]),然后再写成by(r=>r[4])


当然,您可以编写自己的
OrderBy
ThenBy
扩展方法来处理二维数组。这在使用上更具可读性,但也需要更多的工作,所以我将把这件事留给其他人去做…

我通过修改CodeProject中的示例并添加索引列表进行排序来解决这个问题。希望它能帮助别人

    public static T[,] OrderBy<T>(this T[,] source, Func<T[], T> inKeySelector, IList<int> inThenByColumns)
    {
        var mySingleDimensionArray = source.ConvertToSingleDimension().OrderBy(inKeySelector);
        if (inThenByColumns.Count > 0)
        {
            mySingleDimensionArray = inThenByColumns.Aggregate(
                mySingleDimensionArray, 
                (myCurrent, myColumn) => myCurrent.ThenBy(x => x[myColumn]));
        }
        return mySingleDimensionArray.ConvertToMultiDimensional();
    }
publicstatict[,]OrderBy(此T[,]源代码,Func-inKeySelector,IListinByColumns)
{
var mySingleDimensionArray=source.ConvertToSingleDimension().OrderBy(inKeySelector);
如果(InInByColumns.Count>0)
{
mySingleDimensionArray=在InByColumns.Aggregate中(
mySingleDimensionArray,
(myCurrent,myColumn)=>myCurrent.ThenBy(x=>x[myColumn]);
}
返回mySingleDimensionArray.ConvertToMultiDimensional();
}

提供一个您需要的示例,因为您使用的是二维数组,而不是[]类型的锯齿数组,如何在二维数组的多个轴上进行排序?用于查找更新的问题库我将首先将
对象[,]
转换为更有用的形式,例如行集合,最好是某种特定类型的。然后,您可以轻松地对行进行排序,并以各种方式处理它们。将无用的表示项(
object[,]
)尽可能地分离为代码的一部分-基本上是加载和保存。选中“是”,但您会看到扩展不支持这一点,这意味着您发布的代码“var myResult=myArray.OrderBy(x=>x[1])即使没有遵守,对吗?
OrderBy
对于多维数组也不存在,正如您所期待的那样,我想您错过了CodeProject的一点,其中扩展的代码是,但感谢您阅读并调用了两次,我不确定这是否可行,因为我认为这只是基于第二列重新排序,而不是考虑第一个键,它确实可行;试试看。对于根据第二个键相等的项目,第一个键的顺序保持不变,因为它使用了稳定的排序算法。您是否尝试将
OrderBy
应用于问题中提供的多维数组,甚至都没有exist@Mrinal他使用问题中链接的网站上的自定义扩展方法如果他已经在使用某人的代码,那么问题在哪里
    public static T[,] OrderBy<T>(this T[,] source, Func<T[], T> inKeySelector, IList<int> inThenByColumns)
    {
        var mySingleDimensionArray = source.ConvertToSingleDimension().OrderBy(inKeySelector);
        if (inThenByColumns.Count > 0)
        {
            mySingleDimensionArray = inThenByColumns.Aggregate(
                mySingleDimensionArray, 
                (myCurrent, myColumn) => myCurrent.ThenBy(x => x[myColumn]));
        }
        return mySingleDimensionArray.ConvertToMultiDimensional();
    }