2014-07-09 103 views
0

我要創建一個字典在LINQ匹配父母身份證字典。LINQ字典字典

Pseudo-Model: 
    Int ID; 
    Int Namel 
    Int? ParentID; 

我想創建一個詞典Dictonaries的數據模型。 第一個詞典是那些只有父母 的人的ID,其中包含ID的字典將包含ID,Name。

我知道我可以通過循環做到這一點,但我想弄清楚如何通過LINQ來做到這一點。

+0

爲什麼你要這樣做呢?創建一個扁平的字典不是更容易嗎? –

+0

我想保持父母的孩子關係,即樹,我想看到所有的葉子 –

+2

有趣的... 自己給一個鏡頭,並解釋你與示例代碼的問題。在此之前,這不是一個有效的問題。 –

回答

10

GroupBy創建一個具有Key值,你可以遍歷(或進行其他LINQ的呼籲)的IGrouping

ToDictionary需要兩個選擇器 - 一個用於鍵和一個用於值。外字典的關鍵字爲ParentID,值爲另一個字典,關鍵字爲ID,值爲Name

假設ID是唯一的(至少內的ParentID基團)可以這樣做:

_model.Terrtories 
     .GroupBy(i => i.ParentID.HasValue ? i.ParentID.Value : 0) 
     .ToDictionary(g => g.Key, // outer dictionary key 
        g => g.ToDictionary(i => i.ID, // inner dictionary key 
             i => i.Name)); // inner dictionary value 

注意到外ToDictionary第二個參數平移每個組內的物品放入內部字典。

+0

This Kinda Make sense現在,我只是困惑關於它如何作用於團隊之後,因爲現在它是一羣東西。 也有一種方法來做組,如果父ID是空分配給0? –

+0

它是'Territory'對象的分組。 'IGrouping'實現'IEnumerable ',所以你可以使用Linq,就好像它是一個單獨的集合。 –

+0

我無法理解我是在分組後對IEnumberable採取行動的。這現在的作品也修復空問題我仔細全部爲空0 var Terr = _model.TerritoryRightsLookups.ToList(); Terr.ForEach(i => {i = FK_ParentID =(i.FK_ParentID == null)?0:i.FK_ParentID; }); (i => i.Key,i => i.ToDictionary(g => g.ID,g => g.Name)); –

0

我不知道你會怎麼做,但這是它可能看起來像什麼。

var dict = new Dictionary<int, Dictionary<int,string>>() 
{ 
    { 1, new Dictionary<int, string>() 
     { 
      {1, "Name1"}, 
      {2, "Name2"}, 
      {3, "Name3"}, 
     } 
    }, 
    { 2, new Dictionary<int, string>() 
     { 
      {1, "Something1"}, 
      {2, "Something2"}, 
      {3, "Something3"}, 
     } 
    }, 
}; 

如果要表示父/子關係,爲什麼不創建父/子關係?

public class Parent 
{ 
    public int ID { get; set; } 

    public List<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 
+0

我知道如何編寫這個代碼,我只是想在LINQ中這樣做,所以我不必寫出所有的代碼,我知道如何去做以備將來參考 –