2016-09-22 80 views
1

我希望能够对两列上的二维数组进行排序。我已成功使用的代码扩展到做它在一列从CodeProject在C#中动态或不动态地对2个对象[,]进行排序

using System.IO; 
using OfficeOpenXml; 

namespace TestEPPlus 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ExcelPackage package = new ExcelPackage(new FileInfo(@"C:\IAIN\Test.xlsx")); 
      ExcelWorksheet workSheet = package.Workbook.Worksheets["Sheet1"]; 

      object[,] myArray = workSheet.Cells.Value as object[,]; 

      // Sorts the Array by Column 1 
      var myResult = myArray.OrderBy(x => x[1]); 

     } 
    } 
} 

在这个例子中Orderedby线排序上的列1.我想排序的列1和列4

enter image description here

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

感谢所有,

+0

提供你需要什么的例子中,由于正在使用的2维阵列,而不是类型[] []的交错数组,你怎么排序多于用于2D阵列 –

+0

感谢一个轴看起来更新的问题更清晰 – bibble235

+1

我会开始通过将'object [,]'转换为更有用的形式,例如行的集合,理想情况下是某种特定的类型。然后,您可以轻松订购行并以各种方式与它们一起工作。将无用的表示('object [,]')隔离为尽可能小的一段代码 - 基本上加载并保存。 –

回答

-1

进行排序,我们可以使用ThenBy/ThenByDescending其次是排序依据多列是指例如

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

是的,但你会看到扩展名不支持这 – bibble235

+0

这意味着你的发布代码“ var myResult = myArray.OrderBy(x => x [1]);“甚至不是正确的? –

+0

'OrderBy'不存在多维数组,因为你期待 –

0

最简单的方法是调用两次OrderBy扩展方法如下。由于linq使用稳定的排序算法,第一次调用后元素的顺序将保留给第二次调用中具有相同值的元素。

matrix.OrderBy(r => r[4]).OrderBy(r => r[1]); 

请注意,对于这一点,你需要在你通常会怎么做反向订购:对于(一维)枚举你宁愿写为matrix.OrderBy(r => r[1]).ThenBy(r => r[4]);

当然,你可以写你的拥有OrderByThenBy扩展方法来处理二维数组。这将更多的使用可读性,但也更多的工作,所以我会留给他人做...

+1

调用两次,不知道这会工作,因为我认为这只会基于**第二列重新排序,而不会考虑第一个键 – bibble235

+0

它确实有效;尝试一下。第一个键的顺序保留为根据第二个键相等的项目,因为它使用稳定的排序算法。 – Steven

+0

您是否尝试将'OrderBy'应用到问题中提供的多维数组中,它甚至不存在 –

0

我解决了这个通过修改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(); 
    }