0

我有一个看起来像的 DataTable

Agency          | Contact         | Group
Agency1           person1           lunch runners
Agency1           person1           band
Agency1           person3           basketball
Agency2           person4           band

我想按代理机构,然后按联系人姓名对它们进行分组。我尝试过使用 linq 50 种不同的方式,但都碰壁了。有人可以阐明一点吗?谢谢。

4

3 回答 3

2

使用匿名类型:

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
于 2013-10-21T19:42:09.767 回答
0

collection.GroupBy(x => new { x.Agency, x.Contact })应该这样做。这将创建一个用于密钥的匿名对象。

请注意,您必须像@TimSchmelter 在他的回答中那样将这个一般想法应用于 DataTable。

如果您需要组的层次结构(即 Agency1 组内部有一个 person1 组),您可以这样做:

collection.GroupBy(x => x.Agency).Select(x => x.GroupBy(y => y.Contact));
于 2013-10-21T19:41:58.607 回答
0
var results = db.<EntityCollection>
    .ToLookup(a => a.Agency)
    .ToDictionary( lu => lu.Key, lu => lu.ToLookup( lui => lui.Contact ) );

然后可以访问如下:

results[<agencyName>][<contactName>]
于 2013-10-21T20:06:21.957 回答