也许有人知道如何在linq(或lambda)中实现这种查询。
我在列表中设置了这个
过滤器:我的输入将是代码100和101,我需要获取“值”,在此示例中= 1,2。
问题:如果您输入100和101,您将获得3个结果,因为来自第1组和第2组的100个。我只需要在同一组中匹配的对。 (并且你没有组作为输入参数)
如果该组完全存在,我该如何解决这个问题?
谢谢!
答案 0 :(得分:1)
从代码中的简单表示开始:
var list = new[]
{
new{code = 100, value = 1, group = 1},
new{code = 101, value = 2, group = 1},
new{code = 100, value = 3, group = 2},
new{code = 103, value = 4, group = 2},
};
var inp = new[]{100, 103};
然后我们可以这样做:
list
.GroupBy(el => el.group) // Group by the "group" field.
.Where(grp => !inp.Except(grp.Select(el => el.code)).Any()) // Exclude groups that don't contain all input values
.Single() // Obtain the only such group (with a check that there is only one)
.Select(el => el.value); // Obtain the "value" fields.
如果您的输入可能是某些组的“代码”字段的子集,您还可以通过排除具有不同大小的组来检查您是否完全匹配所有组:
list
.GroupBy(el => el.group)
.Where(grp =>
grp.Count() == inp.Count()
&& !inp.Except(grp.Select(el => el.code)).Any())
.Single()
.Select(el => el.value);
还有其他变体与您问题的其他可能解释相匹配(例如,我假设只有一个匹配组,但目前尚不清楚)。