Linq Group by Values in a list

时间:2015-03-12 16:51:00

标签: c# linq

所以目前我有这个TrackingInfo类,它包含一个ID和一个EmailActionIDs列表,它是一个int。 我有一个这个类的列表,数据看起来像:

ID,   |   EmailActions
_______________
 A    |   1, 3, 5
 B    |   3, 5, 6
 C    |   2, 4, 6

我正在尝试编写Linq语句将其转换为按列表中每个值分组的ID列表。

所以结果集看起来像:

ID   |   Values
_______________
 1    |   A
 2    |   C
 3    |   A, B
 4    |   C,
 5    |   A, B
 6    |   B, C

我无法弄明白我是怎么写小组的,任何人都可以给我一些见解。

DistinctValues = new List<int> {1,2,3,4,5,6};
TrackingInfo.Groupby(t => DistinctValues.foreach(d => 
                                           t.EmailActions.Contains(d))).Tolist()

对于如何使用Linq

进行此操作,此问题尚无法解决

4 个答案:

答案 0 :(得分:4)

很容易获得EmailActions

的独特列表
var distinctEmailActions = items.SelectMany(i => i.EmailActions).Distinct();

然后转动这有点复杂,但现在是:

var result = distinctEmailActions.Select(e => new { 
              ID=e, 
              Values = items.Where(i => i.EmailActions.Contains(e)).Select(i => i.ID) 
});

实例:http://rextester.com/CQFDY66608

答案 1 :(得分:2)

您正在寻找的是SelectMany,但在此处使用查询语法更容易:

var result = from item in source
             from action in item.EmailActions
             group item.ID by action into g
             select new { ID = g.Key, Values = g.ToList() }

答案 2 :(得分:0)

您可以先使用Enumerable.Range生成一个范围,然后匹配EmailActions,就像这样:

var res = Enumerable.Range(1, 6)
    .SelectMany(v => TrackingInfo.Where(info => info.EmailActions.Contains(v)).Select(info => new { Id, Value = v }))
    .GroupBy(p => p.Value)
    .Select(g => new {
        Id = g.Key
    ,   Values = g.Select(p => p.Id).ToList()
    });

答案 3 :(得分:0)

您可以使用SelectMany&amp; GroupBy是这样的: -

var result = tracking.SelectMany(x => x.EmailActionIDs, 
                                    (trackObj, EmailIds) => new { trackObj, EmailIds })
                     .GroupBy(x => x.EmailIds)
                     .Select(x => new
                       {
                            ID = x.Key,
                            Values = String.Join(",", x.Select(z => z.trackObj.ID))
                       }).OrderBy(x => x.ID);

Working Fiddle