在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表达式中,在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
。