我有一个如下所示的数据列表。
GroupId Color
---------
1 Blue
1 Red
2 Green
2 Blue
3 White
3 Red
3 Yellow
4 Blue
4 Red
我正在尝试编写一个LINQ查询,该查询可用于过滤此集合,使其可以为以下问题提供答案。
给我一个或多个颜色为蓝色和红色的组。 该问题的答案将是ID为1和4的列表。
即使答案是蓝色,答案也不会包含2。匹配项必须准确匹配蓝色和红色。
答案 0 :(得分:1)
var result = list.GroupBy(item => item.GroupdId)
.Where(x=>x.All(y=>y.Color=="Blue" || y.Color=="Red")).Select(x=>x.Key).ToList();
这应该返回您想要的答案。
首先按groupid对项目进行分组,然后查找仅包含“蓝色”或“红色”的所有组,然后在列表中返回组ID。
答案 1 :(得分:0)
这是通用解决方案。
var checkColors = new[] { "Blue", "Red" };
var gp = from d in definitions
group d by d.GroupId
into g
let colorNames = g.Select(dim => dim.Color)
where g.Any(gd => !checkColors.Except(colorNames).Any())
select g.Key;