C# 在具有分组的列表上创建字典
列表中有以下对象:C# 在具有分组的列表上创建字典,c#,.net,linq,.net-3.5,C#,.net,Linq,.net 3.5,列表中有以下对象: public class DemoClass { public int GroupKey { get; set; } public string DemoString { get; set; } public object SomeOtherProperty { get; set; } } 现在,我想用它创建以下词典: Dictionary<int, List<DemoClass>> 但是,有没有办法把它变成一句话呢?你已经
public class DemoClass
{
public int GroupKey { get; set; }
public string DemoString { get; set; }
public object SomeOtherProperty { get; set; }
}
现在,我想用它创建以下词典:
Dictionary<int, List<DemoClass>>
但是,有没有办法把它变成一句话呢?你已经把它写成了一行了。只需将
ToDictionary
放在第一行的末尾。如果希望它更短,请使用函数组合语法而不是查询语法
var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
group demoClass by demoClass.GroupKey
into groupedDemoClass
select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
这个可以用 只是为了制造混凝土:
var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
.GroupBy(x => x.GroupKey)
.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
当然,如果使用更短的变量名,则会使其更短:)
然而,我是否可以建议a可能更合适?查找基本上是一个从键到IEnumerable
的字典-除非您真的需要值作为列表,否则它会通过调用使代码更短(更高效):
我有点离题了,但我找到了这个主题,因为我在寻找一种方法,在Linq中创建一个字典,这里的对话引导我找到了答案
您可以使用linq创建多级字典,这对于具有多个要搜索的键或维度的场景非常有用。诀窍是创建一个分组,然后将其转换为字典,如下所示:
Dim qry = (From acs In ActualSales _
Group By acs.ProductID Into Group _
Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
).ToDictionary(Function(c) c.ProductID)
If qry.ContainsKey(_ProductID) Then
With qry(_ProductID)
If .Months.ContainsKey(_Period) Then
...
End If
End With
End If
生成的查询可按如下方式使用:
Dim qry = (From acs In ActualSales _
Group By acs.ProductID Into Group _
Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
).ToDictionary(Function(c) c.ProductID)
If qry.ContainsKey(_ProductID) Then
With qry(_ProductID)
If .Months.ContainsKey(_Period) Then
...
End If
End With
End If
希望这对其他需要此类查询的人有所帮助。我认为在长期环境中,查找的性能不如构建的词典,因为它为每个请求构建了新的结果。。。如果我错了,请纠正我!不,它会创建整个查找。一般来说,ToXXX不使用延迟执行(你可能会想到一个分组,这确实是延迟的)。如果我不是那么恶意,我会投票支持你。为了Linq而来,为了我从未听说过的数据结构而留下@sasikt:模型是你可以查找任何东西,如果密钥不存在,你只会得到一个空集合。依我看,这通常比TryGetValue方法更有用。