【问题标题】:Convert a List<T> to a nested Dictionary<string, Dictionary<string, T>将 List<T> 转换为嵌套 Dictionary<string, Dictionary<string, T>
【发布时间】:2018-04-20 14:45:23
【问题描述】:

我遇到了一个基本问题。我需要将平面列表转换为 Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,string&gt;&gt;&gt;&gt; 类型的嵌套字典

除了需要对多个属性进行分组之外,我几乎完成了,为此我使用了匿名类型。这是一个例子:

List<ApprovalAction> Gen()
{
    return new List<ApprovalAction>
    {
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Homeworking", ParameterName = "to", ParameterValue="Approver" },
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Homeworking", ParameterName="subject", ParameterValue = "Aproval Request" },
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Homeworking", ParameterName="body", ParameterValue = "I would like an approval request"},
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Absence", ParameterName="to" , ParameterValue="Approver" },
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Absence", ParameterName="subject", ParameterValue = "Aproval Request" },
        new ApprovalAction { Name = "SendMailToApprover", Step="New", ApprovalRequestType = "Absence", ParameterName="body", ParameterValue = "I would like an approval request"}
    };
}


    var actions = Gen();
    var dico = actions
                .GroupBy(x => x.ApprovalRequestType)
                .ToDictionary(
                    gdc => gdc.Key,
                    gdc => gdc.GroupBy(a => a.Step)
                            .ToDictionary(dd => dd.Key, dd => dd.GroupBy(x => new { x.Name, x.Step, x.ApprovalRequestType }, (key, group) => new
                            {
                                Key = key.Name,
                                Result = group.ToDictionary(k => k.ParameterName, v => v.ParameterValue)
                            })));

这是 Linqpad 的输出:

你知道我可以用哪个代码替换来避免 IEnumerable 吗?

谢谢!

【问题讨论】:

  • .FirstOrDefault()
  • 解释你想做什么,而不是你怎么做。看起来你想通过 ApprovalRequestType 创建一些东西的层次结构(什么?),然后呢?很难理解代码的作用,因为它甚至不适合不滚动的问题。你可以通过某种分组来做到这一点,但你必须先解释你想做什么
  • Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,Dictionary&lt;string,string&gt;&gt;&gt;&gt;???你如何从List&lt;T&gt; 到那个怪物?
  • 关于怪物,如果您为每个级别创建不同的类型,它会很多更容易工作。你不需要字典。如果你认为你需要它们,例如你想生成 Json,你不需要。 JSON 序列化器自己将对象图转换为字典符号
  • 如果我可以选择...

标签: c# linq dictionary


【解决方案1】:

IEnumerable&lt;&gt; 来自最终的GroupBy。如果您知道最里面的组将只包含一项,请使用Single()。否则使用First():

var dico = actions
    .GroupBy(x => x.ApprovalRequestType)
    .ToDictionary(
        gdc => gdc.Key,
        gdc => gdc.GroupBy(a => a.Step)
            .ToDictionary(dd => dd.Key, dd => dd.GroupBy(x => new { x.Name, x.Step, x.ApprovalRequestType }, (key, group) => new {
                Key = key.Name,
                Result = group.ToDictionary(k => k.ParameterName, v => v.ParameterValue)
            }).First()
        )
    );

上面的查询结果如下:

【讨论】:

  • 哦,完美,我将 .First() 替换为 .ToDictionary(k => k.Key, v => v.Result) 以避免 ø
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
相关资源
最近更新 更多