【问题标题】:LINQ Dictionary of Dictionaries [closed]LINQ 词典 [关闭]
【发布时间】:2014-07-09 19:39:07
【问题描述】:

我要在 LINQ 中创建与父 ID 匹配的字典字典。

我有一个数据模型

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

我想创建一个字典词典。 第一个字典是那些只是父母的人的ID 并且其中的字典将包含 ID、名称。

我知道我可以通过循环来做到这一点,但我想通过 LINQ 弄清楚如何做到这一点。

【问题讨论】:

  • 你到底为什么要这样做?创建 的平面字典不是更容易吗?
  • 我要保持父子关系,即树,我要看到所有的叶子
  • 有趣...自己试一试,并用示例代码解释您遇到的问题。在那之前,这不是一个有效的问题。
  • 提示:查找GroupByToDictionary
  • @user1938988 你走在正确的轨道上。查看ToDictionary 的文档和示例 - 第一个参数是键选择器,第二个是值选择器。提示 2:值选择器将再次调用ToDictionary

标签: c# linq dictionary


【解决方案1】:

GroupBy 创建一个带有 Key 值的 IGrouping,您可以对其进行迭代(或进行额外的 LINQ 调用)。

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 的第二个参数是将每个组中的项目转换为内部字典。

【讨论】:

  • 这有点道理现在,我只是对它在组之后的作用感到困惑,因为现在它是一组东西。另外有没有办法进行分组,如果父 ID 为空,则将其分配给 0?
  • 这是一组Territory 对象。 IGrouping 实现了 IEnumerable<T>,因此您可以在其上使用 Linq,就好像它是一个单独的集合一样。
  • 我无法理解我在分组后对 IEnumberable 进行操作。这现在也可以解决 Null 问题,我将所有 null 预置为 0 var Terr = _model.TerritoryRightsLookups.ToList(); Terr.ForEach(i => { i.FK_ParentID = (i.FK_ParentID == null) ? 0 : i.FK_ParentID; }); var temp = Terr.GroupBy(i => i.FK_ParentID).ToDictionary(i => i.Key, i => i.ToDictionary(g => g.ID, g => g.Name));
  • @DStanely 感谢您对此的帮助,我有时在存储我的树结构时仍然会参考这个问题
【解决方案2】:

我不知道你会用这个做什么,但这就是它的样子。

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; }
}

【讨论】:

  • 我知道如何编写代码,我只想在 LINQ 中编写,所以我不必写出所有代码,我知道如何编写以供将来参考
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2011-07-06
  • 2012-08-05
  • 2011-02-14
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多