我想知道,如果某樣,我試圖做項目的排序和收集是可能的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++;
}
}
那麼你想如何訂購?看起來沒有特定的順序來完成你想要完成的任務 – code