2015-07-21 33 views
0

我想知道,如果某樣,我試圖做項目的排序和收集是可能的LINQ重複的組。使用LINQ以重新排序列表轉換成基於元素屬性

我有一個所有屬於某個訂閱的人的列表。

用於該類可能看起來像:

public class Person 
{ 
    public string name {get; set;} 
    public int subscriptionId {get; set;} 
} 

比方說,我有這樣的數據列表:

Subscription ID | Name 
-------- 
1 - bob 
1 - River 
5 - Phil 
2 - Jayne 
2 - Malcolm 
5 - Doug 
2 - Kaylee 
2 - Joe 
1 - Dan 
1 - Greg 
5 - Zoe 
2 - Carl 
5 - Kerney 

,我會想要列表落得像:

1 - bob 
1 - River 
2 - Jayne 
2 - Malcolm 
5 - Phil 
5 - Doug 
// Note that the subscriber id repeats in the same pattern. 
1 - Dan 
1 - Greg 
2 - Kaylee 
2 - Joe 
5 - Zoe 
5 - Kerney 
// No more 1 or 3 subscibers so we have only Carl 
2 - Carl 

在這個例子中指出,在第二個列表,我們採取2人從第一訂閱,然後兩個人從第二次訂閱,等等。然後,在完成所有訂閱後,我們將重新開始第一次訂閱,抓住下一個訂閱者重複此過程,直到所有訂閱者都被枚舉。

編輯: 基本上我問我是否有可能在linq拿一個單一的項目列表,並以重複模式排序。因此,在上面的示例中,您將首先通過subscriptionId進行訂購,然後您將採取2次移動到下一個最低的subscriptionId並再次取2,並保持該順序,直到您需要重複此過程。所以在上面的例子中有云:1,1,2,2,5,5,1,1,2,2,5,5,2

編輯2:

我寫了一個快速我認爲我完成了我想要做的一些小代碼片段。詢問linq查詢是否存在的原因是,是否有可能將此功能集成到一個列表中,然後循環訪問該列表。

  List<int> subscriptionIds = people.Select(s => s.subscriptionId).Distinct().ToList(); 

      List<List<Person>> jaggedPersonArray = subscriptionIds.Select(sId => people.Where(s => s.subscriptionId == sId).ToList()).ToList(); 

      int subscriptionsHit = 0; 
      int jaggedPersonArrayIndex = 0; 
      int personsIndex = 0; 

      while (people.Count - subscriptionsHit > 0) 
      { 
       List<Person> doStuffList = jaggedPersonArray[jaggedPersonArrayIndex].Skip(personsIndex).Take(2).ToList(); 
       subscriptionsHit += doStuffList.Count; 
       //do stuff with doStuffList 
       if (jaggedPersonArrayIndex >= jaggedPersonArray.Count - 1) 
       { 
        jaggedPersonArrayIndex = 0; 
        personsIndex += 2; 
       } 
       else 
       { 
        jaggedPersonArrayIndex++; 
       } 
      } 
+3

那麼你想如何訂購?看起來沒有特定的順序來完成你想要完成的任務 – code

回答

1

這LINQ表達式將產生,其中最大的兩個人與給定訂閱ID的各組的人列出你所要求的輸出。

List<Person> groupedPeople = people 

    // Group the list by id 
    .GroupBy(p => p.SubscriptionId) 

    // Expand into a collection of anonymous objects with a group key 
    // set by the position in the group 
    .SelectMany(g => g.Select((p, i) => new 
     { GroupKey = i/2, SubscriptionId = p.SubscriptionId, Person = p })) 

    // Re-order the list by group key and subscription ID 
    .OrderBy(x => x.GroupKey).ThenBy(x=> x.SubscriptionId) 

    // Extract the original objects 
    .Select(x => x.Person); 

關鍵表達式是GroupKey = i/2。分母值2表示每組最多允許2個項目。