2017-01-11 19 views
0
的頻率的範圍內進行排序整數的升序排列的陣列

我的輸入是如下LINQ或蘭巴於設定其重複

int[] arr = new int[] { 3, 1, 2, 2, 4, 6, 6, 9, 9, 9, 7, 7, 7}; 

所見,

3,1,4 are repeated only 1 time 
2, 6 are repeated 2 times each 
9, 7 are repeated 3 times each. 

如何寫邏輯,用於按照在出現頻率範圍內升序的方式對數組進行排序

上述陣列的預期輸出爲 1, 3, 4, 2, 2, 6, 6, 7, 7, 7, 9, 9, 9

我嘗試:

var res = (arr.OrderBy(i => i).Reverse() 
      .GroupBy(x => x) 
      .Where(g => g.Count() >= 1) 
      .ToDictionary(x => x.Key, y => y.Count()) 
      .Select(x => x) // stuck here 
      ).ToList(); 
+0

是否有任何規範限制你只使用LINQ而不是傳統的for循環,它可以使你的嘗試更容易? – apomene

+0

@apomene:傳統的循環也會做,但首選使用LINQ或Lambda –

+0

你不應該訂購你正在分組的項目。並按'Count'ThenBy'值排序。 'SelectMany'是扁平化一個兩級目標樹的關鍵 –

回答

10

嘗試是這樣的:

var result = arr.GroupBy(x => x) 
       .OrderBy(g => g.Count()) 
       .ThenBy(g => g.Key) 
       .SelectMany(g => g); 

這將組中的元素,排序第一的元素(升序)的數目,然後由元素值和最終扁平化爲一個枚舉。

+1

謝謝,這是正確的,我從來沒有想到它是如此簡單。 :) –