返回按不同 linq 值分组
本文关键字:linq 返回 | 更新日期: 2023-09-27 18:36:14
我有一个看起来像
Agency | Contact | Group
Agency1 person1 lunch runners
Agency1 person1 band
Agency1 person3 basketball
Agency2 person4 band
我想按机构分组,然后按联系人姓名分组。我尝试过使用 linq 50 种不同的方式,但遇到了困难。有人能透露一点光吗?谢谢。
使用匿名类型:
var groups = table.AsEnumerable()
.GroupBy(r => new
{
Agency = r.Field<string>("Agency"),
Contact = r.Field<string>("Contact")
});
foreach (var agencyContactGroup in groups)
Console.WriteLine("Agency: {0} Contact: {1} Groups: {2} Count: {3}"
, agencyContactGroup.Key.Agency
, agencyContactGroup.Key.Contact
, string.Join(",", agencyContactGroup.Select(r => r.Field<string>("Group")))
, agencyContactGroup.Count());
与示例数据一起输出:
Agency: Agency1 Contact: person1 Groups: lunch runners,band Count: 2
Agency: Agency1 Contact: person3 Groups: basketball Count: 1
Agency: Agency2 Contact: person4 Groups: band Count: 1
collection.GroupBy(x => new { x.Agency, x.Contact })
应该这样做。这将创建一个用于密钥的匿名对象。
请注意,您必须将这个一般概念应用于 DataTable,就像@TimSchmelter在他的答案中所做的那样。
如果您需要组的层次结构(即 Agency1 组内部有一个 person1 组),您可以这样做:
collection.GroupBy(x => x.Agency).Select(x => x.GroupBy(y => y.Contact));
var results = db.<EntityCollection>
.ToLookup(a => a.Agency)
.ToDictionary( lu => lu.Key, lu => lu.ToLookup( lui => lui.Contact ) );
然后可以按如下方式访问:
results[<agencyName>][<contactName>]