2014-07-09 107 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中这样做,所以我不必写出所有的代码,我知道如何去做以备将来参考 –