我如何组通过使用匿名类型

问题描述 投票:1回答:3

我正在从一个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>”不包含“字段2”的定义,并没有可访问的扩展方法“字段2”接受型“IGrouping <,dataElements>”的第一个参数可以发现(是否缺少using指令或程序集引用?)App.Program C:..... CS 498活动

c# linq anonymous-types
3个回答
2
投票

您需要选择之前访问他们字段:

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

现在你可以访问字段2:

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

或者你可以在你的for循环:

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

2
投票

您需要Key前选择Field2。尝试这个:

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

1
投票

因为它说,一群不知道Field2是什么,所以你需要获取该组的每个元素。尝试这个:

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

这是可以做到,因为dataItem本身具有Field2。这将通过各组中的每个元素进行迭代。如果你想只显示组的键,然后只是抓住关键:

foreach (var group in dataItems) 
{
     Console.WriteLine(group.Key.Field2);
}
© www.soinside.com 2019 - 2024. All rights reserved.