C# 通过另一个条件更改LINQ中的条件
我有两条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
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检查。然而,我认为在我的原始解决方案中,这也会得到优化。因此,在我的情况下,这是一个很好的解决方案。但我希望会有一个更好的解决方案来适应我们面临的每一种情况。