[英]Refactoring LINQ query
考虑以下
if(type== "S")
{
lstItem.ItemsSource = (from item in Items
where item.Property1 == "SomeValue"
select item);
}
else
{
lstItem.ItemsSource = (from item in Items
where item.Property2 == "SomeOtherValue"
select item);
}
可以看出,这两个查询之间的唯一区别仅在于属性名称(第一个是Property1 ,第二个是Property2 )
有没有更好的方法在结构化的mannner中重构/编写代码(一些常见的方法,只传递属性名称,并按照那样过滤记录)或者这是做同样的正确方法?
需要帮忙。
谢谢
如果在where子句中也可以添加内联
lstItem.ItemsSource =
(from item in Items
where (test == "S" ? item.Property1 == "SomeValue" : item.Property2 == "SomeOtherValue")
select item);
您可以在if语句中链接命令。 例如:
var items = from item in Items
select item;
if(type== "S")
{
items = items.Where(item => item.Property1 == "SomeValue");
}
else
{
items = items.Where(item => item.Property2 == "SomeOtherValue");
}
或者甚至只是在你的orignal代码中写出更整洁的lambda结构:
if(type== "S")
{
lstItem.ItemsSource = Items.Where(item => item.Property1 == "SomeValue");
}
else
{
lstItem.ItemsSource = Items.Where(item.Property2 == "SomeOtherValue");
}
我喜欢:
lstItem.ItemsSource = Items.Where(type == "S" ?
item => item.Property1 == "SomeValue":
item => item.Property2 == "SomeOtherValue");
好吧,你可以先将表达式归结为:
Func<Items, bool> expr;
if(type== "S")
{
expr = (item => item.Property1 == "SomeValue");
}
else
{
expr = (item => item.Property2 == "SomeOtherValue");
}
var items = Items.Where(expr);
当然,游戏计划真的是让它成为一个单独的状态网络,但是这让我觉得它更易于管理:)
吉姆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.