如何使用匿名类型分组

时间:2019-02-09 05:04:20

标签: c# linq anonymous-types

我从linq查询中获取结果集,然后使用group by对两个字段进行分组:

var dataElements = dataElements.GetAll();

var dataItems = dataElements.Where(el => el.Field1 == "DATE")
     .GroupBy(x => new { x.Field2, x.Field3})
     .ToList();

//why can't I do this:
foreach (var element in dataItems)
{
    Console.WriteLine(element.Field2)
}

我收到以下错误:

  

严重性代码描述项目文件行抑制状态   错误CS1061'IGrouping <,dataElements>'不包含'Field2'的定义   并且没有可访问的扩展方法“ Field2”接受第一个   可以找到类型为'IGrouping <,dataElements>'的参数(您是否缺少   指令或汇编   参考?)App.Program C:..... cs 498有效

3 个答案:

答案 0 :(得分:2)

您需要先选择字段,然后才能访问它们:

var dataItems = dataElements.Where(el => el.Field1 == "DATE")
 .GroupBy(x => new { x.Field2, x.Field3})
 .Select(x=>new {Field2=x.FirstOrDefault().Field2})
 .ToList();

现在您可以访问 Field2

foreach (var element in dataItems)
{
  Console.WriteLine(element.Field2)
}

或者,您也可以在for循环中这样做:

foreach (var group in dataItems)
{
  foreach(var item in group)
     Console.WriteLine(item.Field2);
}

答案 1 :(得分:2)

您需要先选择Key,然后再选择Field2。试试这个:

foreach (var element in dataItems)
{
    Console.WriteLine(element.Key.Field2)
}

答案 2 :(得分:1)

正如上面所说,组不知道 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"> </script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"> </script> <script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"> </script> <script type="text/javascript"> $(document).ready(function() { $('#box,#box1,#box2').draggable({ stack: "div", distance: 0 }); }); </script> 是什么,因此您需要获取组中的每个元素。试试这个:

Field2

之所以可以这样做是因为foreach (var group in dataItems) { foreach(var element in group) { Console.WriteLine(element.Field2); } } 本身具有dataItem。这将遍历每个组的每个元素。如果您只想显示组中的键,则只需抓住键即可:

Field2