我有两条LINQ线,只在一种情况下不同。
node.Image.Tag == null
和node.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));
但它不是我想要的。
答案 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()));
}