LINQ查询检查一个集合是否包含两个具有特定值的记录?

时间:2017-07-12 09:21:44

标签: c# linq

我正在寻找一个只有当一组数据至少有一条带有State == 0的记录而另一条带有State > 0

的记录时才返回true的查询

我有这个方法:

  public bool HasHistory(Guid id)
        {
            return GetHistory(id).Any(x => x.State == 0); //&&x.State > 0 ?!
        }

我不知道如何实现这一点,因为大多数LINQ扩展方法分别迭代每个元素!

4 个答案:

答案 0 :(得分:10)

这个有什么问题?

  public bool HasHistory(Guid id)
  {
      var history = GetHistory(id);
      return history.Any(x => x.State == 0) && history.Any(x => x.State > 0);
  }

实际上,如果你正在使用大数据,这很糟糕,因为你枚举了2次而不是1次。否则,只需使用此解决方案。

答案 1 :(得分:3)

    public bool HasHistory( Guid id )
    {
        var history = GetHistory( id );
        var check1 = false;
        var check2 = false;
        return history.Any( x =>
        {
            check1 = check1 || x.State == 0;
            check2 = check2 || x.State > 0;
            return check1 && check2;
        } );
    }

答案 2 :(得分:2)

只需使用&& - 运算符组合不同查询的结果:

public bool HasHistory(Guid id)
{
    var hist = GetHistory(id);
    return hist.Any(x => x.State == 0) && hist.Any(x => x.State > 0);
}

答案 3 :(得分:0)

您可以使用Aggregate方法:

public bool HasHistory(Guid id)
{
    var result = GetHistory(id)
        .Aggregate(new { stateIsZero = true, stateIsPositive = true, hasItems = false },
        (a, x) => new
        {
            stateIsZero = a.stateIsZero && x.State == 0,
            stateIsPositive = a.stateIsPositive && x.State > 0,
            hasItems = true
        });
    return result.stateIsZero && result.stateIsPositive && result.hasItems;
}

但这种方法不适用于IQueryable