2013-03-22 96 views
-1

我有一個按以下順序打印到pdf的項目數組。 比方說,對於如:以自定義的方式重新排序陣列

lines = {1, 2, 3, 
     4, 5, 6, 
     7, 8, 9, 
     10} 

是我的數組的內容。

但是我想在數組中的項目的順序更改爲

{1, 4, 7, 
    2, 5, 8, 
    3, 6, 9, 
    10} 

然後我這個數組傳遞給我的打印引擎。基本上,如果數組中有3個以上的項目,我的新代碼應該對它重新排序。

有人能幫我弄清楚這個邏輯嗎。

由於

+2

看起來你基本上要採取二維數組轉置行和列。那是對的嗎? – 2013-03-22 03:50:39

+0

我認爲這是一個一維數組,但他想把它當作一個二維數組並轉置它,導致另一個具有相同元素的一維數組以不同順序排列 – 2013-03-22 04:00:01

回答

4

通過行索引的模數對行數進行排序。

public static ICollection<T> Sort<T>(ICollection<T> lines, int columns) 
{ 
    var rows = lines.Count/columns; 
    if (rows == 0) 
    { 
     return lines; 
    } 
    return lines.Select((line, i) => new {line, i}) 
       .OrderBy(item => item.i < columns*rows ? item.i%rows : rows) 
       .Select(item => item.line) 
       .ToList(); 
} 

編輯:或者您可以使用一個迭代方法和列表的索引,而不是LINQ的:

public static IEnumerable<T> Sort<T>(IList<T> lines, int columns) 
{ 
    var rows = lines.Count/columns; 
    for (var i = 0; i < lines.Count; i++) 
    { 
     var index = rows > 0 && i < columns*rows 
      ? (i%columns)*rows + i/columns 
      : i; 
     yield return lines[index]; 
    } 
} 
+0

+1。你甚至不需要'IList '這個代碼'IEnumerable '就足夠了。使用'IList ',您可以刪除「zip」/排序部分(首先選擇),而只是按最終位置選擇項目。 – 2013-03-22 04:46:03

+0

附註:請考慮編輯你的答案,以內聯你正在回答的確切問題。 – 2013-03-22 04:48:31

+0

我通常不喜歡使用IEnumerable,如果我需要知道元素的數量。爲什麼我需要在我的答案中重申這個問題? – 2013-03-22 05:19:17

0

假設 「爲線性陣列假設每9個元件形成3×3矩陣轉置每個子序列,保持剩餘原樣」:

// assuming T[] items; 
var toTranspose = (items.Count()/9) * 9; 
var remap = new int[]{1, 4, 7, 2, 5, 8, 3, 6, 9 }; 

var result = Enumerable.Range(0, toTranspose) 
    .Select(pos => items[(pos/9) * 9 + (remap[pos % 9] - 1)]) 
    .Concat(items.Skip(toTranspose) 
    .ToArray(); 

的代碼總結:

  • GET需要移動的項目數量(9個項目的組數量int numberOfGroup = Count()/9;,乘以組大小)
  • 具有在remap陣列自定義轉換(注意,索引複製原樣從樣品和在計算指數實際上斷接一個因此-1)從對應的組
  • toTranspose獲取源元素中的每個元素索引,並用remap應用變換。
  • 終於Concat其餘。

注:

  • 如果需要的話可以很容易地提供自定義轉換或內聯換位。
  • 無法將轉換應用於最後一個部分組,因爲元素必須轉至不存在的位置。
+0

爲什麼你需要'var toTranspose =(items.Count()/ 9)* 9;' - 這基本上只是'items.Count()'? – 2013-03-22 04:06:18

+1

@SudiptaChatterjee'(10/9)* 9!= 10' :) – 2013-03-22 04:07:44