所以目前我有这个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
进行此操作,此问题尚无法解决答案 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)
});
答案 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);