2016-09-22 81 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(); 
    }