在linq c#中查找groupby的原始键

本文关键字:原始 groupby 查找 linq | 更新日期: 2023-09-27 18:04:24

var aaa = data.GroupBy(o => o.Date).Select(o => new { o }).ToList();
var bbb = aaa.Select(o => o.Key).ToList();
//There is a error of `Key`

这是否意味着Key只允许用于GroupBy之后的原始列表?GroupBy之后的Select是否有可能得到Key(当然,我们可以将Key = o.Key存储在Select中)

,

var aaa = data.GroupBy(o => o.Date).Select(o => o.ToList()}).ToList();

如果我们把aaa变成二维的List,是否可以得到之前的Key ?

在linq c#中查找groupby的原始键

在您的第一个linq表达式中,在Select中,您正在用新的匿名对象包装从GroupBy获得的IGrouping对象。因此,要在第二行中获得Key属性,您应该:

//Original:
var bbb = aaa.Select(o => o.Key).ToList();
//Change to:
var bbb = aaa.Select(o => o.o.Key).ToList();

对于第二个问题,如果您想在这种情况下获得Key:

//Original:
var aaa = data.GroupBy(o => o.Date)
              .Select(o => o.ToList()})
              .ToList();
//Then you should:
var aaa = data.GroupBy(o => o.Date)
              .Select(o => o.ToList()})
              .Select(x => o.FirstOrDefault().Date)
              .ToList();

存在的原因是:

  • Date
  • 将物品分组
  • 首先选择将igrouing转换为List<YourClass>,但现在您有IEnumerable<List<YourClass>>,其中IEnumerable中的每个记录,所有内部项目都将具有相同的日期
  • 在第二个Select -取内部集合中的任何项目-并获得Date,它与在
  • 之前的示例中获得Key相同

实现你真正想要得到的东西(按日期分组,并为每组获取符号):

var result = data.GroupBy(item => item.Date)
                 .Select(group => new { group.Key, Symbols = group.Select(item => item.Symbol).ToList() });
//Or using a different overload of the `GroupBy`:
var result = data.GroupBy(item => item.Date,
                          (key,group) => return new { Key = key, Symbols = group.Select(item => item.Symbol).ToList() });

问题是你的语法不正确。您创建了一个匿名对象,因此需要使用实例名访问该属性。所以你应该这么做。

var bbb = aaa.Select(o => o.o.Key).ToList();  

如果我们把aaa变成二维List,是否有可能得到前一个密钥?

不,因为您已经摸索了值集合而不是Key。因此结果将不包含Key