Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在具有分组的列表上创建字典_C#_.net_Linq_.net 3.5 - Fatal编程技术网

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方法更有用。