在另一个条件下改变LINQ中的条件

时间:2015-05-10 05:16:48

标签: c# linq conditional-statements

我有两条LINQ线,只在一种情况下不同。

node.Image.Tag == nullnode.Image.Tag != null

if (treeSelectedNode.Image.Tag == null) 
  {
    radNode = tree.Find(node => node.Level == 0 && node.Image.Tag == null 
                           && node.Text.Equals(treeSelectedNode.Text));
  }
else 
  {
    radNode = tree.Find(node => node.Level == 0 && node.Image.Tag != null 
                           && node.Text.Equals(treeSelectedNode.Text));
  }

有没有办法在LINQ行之前创建条件然后再使用它,这样我就可以删除额外的行?

我知道我可以这样做:

radNode = treeSelectedNode.Image.Tag == null ? tree.Find(node => node.Level == 0 
            && node.Image.Tag == null && node.Text.Equals(treeSelectedNode.Text)) : 
                tree.Find(node => node.Level == 0 && node.Image.Tag != null 
                        && node.Text.Equals(treeSelectedNode.Text));

但它不是我想要的。

3 个答案:

答案 0 :(得分:4)

检查条件node.Image.Tag == null的结果是否与treeSelected.Image.Tag == null的结果相同:

radNode = tree.Find(node => node.Level == 0 && ((node.Image.Tag == null) == (treeSelectedNode.Image.Tag == null)) 
    && node.Text.Equals(treeSelectedNode.Text))

<强>更新

解决@KhanTo的表现问题,部分:

Boolean selectedImgTagIsNull  = treeSelected.Image.Tag == null;
radNode = tree.Find(node => node.Level == 0 && ((node.Image.Tag == null) == selectedImgTagIsNull)
    && node.Text.Equals(treeSelectedNode.Text))

但是,我怀疑JIT优化很可能导致同样的事情,即使我的原始代码也是如此。

答案 1 :(得分:0)

也许oneliner会对你好吗?

radNode = tree.Find(node => node.Level == 0
                    && ((treeSelectedNode.Image.Tag == nulL 
                            && node.Image.Tag == null)
                        || (treeSelectedNode.Image.Tag != nulL 
                            && node.Image.Tag != null))
                    && node.Text.Equals(treeSelectedNode.Text));

答案 2 :(得分:0)

从技术上讲,你可以使用Expression构建那种查询,它需要额外的工作,这里有一个简单的例子:

 private static Expression<Func<T, bool>> AndCombined<T>(Expression<Func<T, bool>> exp1, Expression<Func<T, bool>> exp2)
    {
        ParameterExpression p = exp1.Parameters.Single();
        return Expression.Lambda<Func<T, bool>>(Expression.And(exp1.Body, Expression.Invoke(exp2, p)), exp1.Parameters.Single());
    }

static void Main(string[] args)
    {
        var b = new List<int>() { 30, 15, 5 };

        Expression<Func<int, bool>> test1 = f => f > 10;
        Expression<Func<int, bool>> test2 = f => f < 20;
        var combinedAndQuery = AndCombined(test1, test2);

        var reuslt1 = b.Find(new Predicate<int>(combinedAndQuery.Compile()));
        Expression<Func<int, bool>> test3 = f => f < 40;


        var combinedAndQuery2 = AndCombined(test1, test3);

        var reuslt2 = b.Find(new Predicate<int>(combinedAndQuery2.Compile()));

}