C# 通过另一个条件更改LINQ中的条件

C# 通过另一个条件更改LINQ中的条件,c#,linq,conditional-statements,C#,Linq,Conditional Statements,我有两条LINQ线,它们只在一种情况下不同 node.Image.Tag==null和node.Image.Tag!=空 if (treeSelectedNode.Image.Tag == null) { radNode = tree.Find(node => node.Level == 0 && node.Image.Tag == null && node.Text.Equals(tre

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

node.Image.Tag==null
node.Image.Tag!=空

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

但这不是我想要的。

也许那一行对你合适

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

检查条件
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优化很可能会导致相同的结果,即使是我的原始代码。

从技术上讲,您可以使用表达式构建此类查询,它需要额外的工作,下面是一个简单的示例:

 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()));
私有静态表达式和组合表达式(表达式exp1、表达式exp2)
{
ParameterExpression p=exp1.Parameters.Single();
返回Expression.Lambda(Expression.And(exp1.Body,Expression.Invoke(exp2,p)),exp1.Parameters.Single();
}
静态void Main(字符串[]参数)
{
var b=新列表(){30,15,5};
表达式test1=f=>f>10;
表达式test2=f=>f<20;
var combinedAndQuery=AndCombined(test1,test2);
var reuslt1=b.Find(新谓词(combinedAndQuery.Compile());
表达式test3=f=>f<40;
var combinedAndQuery2=AndCombined(测试1,测试3);
var reuslt2=b.Find(新谓词(combinedAndQuery2.Compile());

}

你能写:
radNode=tree.Find(node=>node.Level==0&&node.Image.Tag==treeSelectedNode.Image.Tag&&node.Text.Equals(treeSelectedNode.Text))?我这样问是因为我不确定您的代码逻辑,
node.Image.Tag==treeSelectedNode.Image.Tag
是否正确correct@KhanhTO不可以。它无法比较两个对象内容。这可能会降低性能,因为每个对象都有更多的检查item@KhanhTO该检查被视为常量时间操作。我确信性能甚至不会引起注意。我倾向于同意@pwas,但我做了一个更新来显示缓存treeSelected.Image.Tag==null检查。然而,我认为在我的原始解决方案中,这也会得到优化。因此,在我的情况下,这是一个很好的解决方案。但我希望会有一个更好的解决方案来适应我们面临的每一种情况。