2017-01-23 58 views
0

假設我有一個從1 - 3的項目列表。如何在C#中使用linq查詢來排序循環順序?

我可以命令他們1,1,2,2,3,3。

但是,相反,我想通過1,2,3,1,2,3命令他們....

是否有一個已經存在的功能來實現這一目標?

+1

否,不存在。我甚至無法用一兩個單詞來命名這種分類。你可以自己實現它。 –

+1

單獨使用LINQ可能在技術上是可行的,但它會很混亂。自己實施它將會更加清潔和高效。 – Abion47

+0

沒有意義。如果它是'1,1,2,2,3,3,3,3,4',輸出結果如何?開箱即用的Linq提供了一些常見的實現,例如按順序或降序排列。這個順序是什麼?看起來像一個非常具體的案例 – CodingYoshi

回答

2

該方法將每個數字分成組,然後按順序迭代組,然後有條件地將它們添加到結果列表中。可能有更多的方法可以讓這個更安全,更高效,但這應該給你一個開始。 (它假定如果沒有源陣列中的每個號碼的相等計數,它將作爲它在迭代階段耗盡它們的跳過這些數字。)

int[] arr = new[] { 1,1,1,2,2,2,3,3,3,4,4,4,5,5,5 }; 

var orderList = arr.OrderBy(x => x).Distinct().ToArray(); 
var refList = arr.GroupBy(x => x).ToDictionary(k => k.Key, v => v.Count()); 

var result = new List<int>(); 
int i = 0; 
while (result.Count < arr.Length) 
{ 
    if (refList.Values.Sum() == 0) 
     break; 

    if (refList[orderList[i]] > 0) 
    { 
     result.Add(orderList[i]); 
     refList[orderList[i]]--; 
    } 

    i++; 
    if (i >= orderList.Length) 
     i = 0; 
} 

// Result: [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5] 
+0

我一般都有這個想法。我會爲自己嘗試一下,因爲1,2,3只是我擁有的一種物體。 –

+0

或潛在的:var result = Enumerable.Range(arr.Min(),arr.GroupBy(x => x).First()。Count()) .SelectMany(y => arr.OrderBy(x => x).Distinct()。ToList());' – CodingYoshi

+0

@CodingYoshi假設A]源列表中的數字保證按順序排列,並且B]保證源列表中每個數字的計數爲等於。 – Abion47