Linq在查询中遇到问题

时间:2015-05-13 16:08:37

标签: linq lambda

也许有人知道如何在linq(或lambda)中实现这种查询。

我在列表中设置了这个

example of data

过滤器:我的输入将是代码100和101,我需要获取“值”,在此示例中= 1,2。

问题:如果您输入100和101,您将获得3个结果,因为来自第1组和第2组的100个。我只需要在同一组中匹配的对。 (并且你没有组作为输入参数)

如果该组完全存在,我该如何解决这个问题?

谢谢!

1 个答案:

答案 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);

还有其他变体与您问题的其他可能解释相匹配(例如,我假设只有一个匹配组,但目前尚不清楚)。