【发布时间】:2018-04-20 14:45:23
【问题描述】:
我遇到了一个基本问题。我需要将平面列表转换为 Dictionary<string,Dictionary<string,Dictionary<string,Dictionary<string,string>>>> 类型的嵌套字典
除了需要对多个属性进行分组之外,我几乎完成了,为此我使用了匿名类型。这是一个例子:
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<string,Dictionary<string,Dictionary<string,Dictionary<string,string>>>>???你如何从List<T>到那个怪物? -
关于怪物,如果您为每个级别创建不同的类型,它会很多更容易工作。你不需要字典。如果你认为你需要它们,例如你想生成 Json,你不需要。 JSON 序列化器自己将对象图转换为字典符号
-
如果我可以选择...
标签: c# linq dictionary