2013-03-21 69 views
3

我有「進入」對象的列表(每有一個ID),並希望通過ID分裂他們以創建基於二維數組:從對象列表創建多維數組

class Entry 
{ 
    public int ID { get; set; } 
    public int value { get; set; } 

    public Entry(int id, int value) 
    { 
     this.ID = id; 
     this.value = value; 
    } 
} 

人口:

 List<Entry> entries = new List<Entry>(); 
     entries.Add(new Entry(0, 20)); 
     entries.Add(new Entry(1, 20)); 
     entries.Add(new Entry(1, 25)); 
     entries.Add(new Entry(2, 21)); 
     entries.Add(new Entry(2, 23)); 

我需要構建一個多維表的條目拆分這家由ID。以下代碼構建陣列:

 List<Entry> entriesZero = new List<Entry>(); 
     entriesZero.Add(new Entry(0, 20)); 

     List<Entry> entriesOne = new List<Entry>(); 
     entriesOne.Add(new Entry(1, 20)); 
     entriesOne.Add(new Entry(1, 25)); 

     List<Entry> entriesTwo = new List<Entry>(); 
     entriesTwo.Add(new Entry(2, 21)); 
     entriesTwo.Add(new Entry(2, 23)); 

     List<List<Entry>> entriesByID = new List<List<Entry>>(); 
     entriesByID.Add(entriesZero); 
     entriesByID.Add(entriesOne); 
     entriesByID.Add(entriesTwo); 

什麼是最好的方式來完成這樣的事情?我可以用多個foreach循環來完成,但我想知道LINQ中是否有更好的方法。

回答

7

您是否確實需要它是列表按ID分組?一個Lookup會爲你做這真的很容易:

ILookup<int, Entry> entriesById = entries.ToLookup(e => e.Id); 

,您仍然可以遍歷這一點,但你也可以查找任何ID的所有條目。

如果你真的需要一個List<List<Entry>>你可以這樣做:

var listOfLists = entriesById.GroupBy(e => e.Id) 
          .Select(g => g.ToList()) 
          .ToList(); 

...但我會用查找去。

+0

我沒不知道查找,那太棒了!雖然我仍然需要列出一個列表,因爲它被設置爲圖表的DataContext。 – David 2013-03-21 22:59:11

0

你也可以這樣做:(非LINQ)

Dictionary<int , List<Entry>> dictionary = new ... 

foreach (var v in entries) 
    dictionary[v.ID].Add(v); 
1

你只需要GroupBy + ToList(一個一個組本身的一個對整個事情):

List<List<Entry>> entriesByID = entries.GroupBy(entry => entry.ID) 
      .Select(g => g.ToList()) 
      .ToList();