我有一个我想根据一些信息过滤的对象列表。例如,可能具有不同水果的水果列表。从这个水果列表中我想获得一个符合特定标准的唯一水果的新列表。
我有:
public List<Fruit> getFruitList(List<Fruit> allFruits, string fruitType, string fruitColor) {
List<Fruit> newFruits = allFruits.Where(f => f.typeOfFruit == fruitType)
.Where(f => f.fruitColor == fruitColor).ToList();
return newFruits;
}
但是,如果有人想要所有水果类型,但只想指定颜色(红色,意味着红苹果和草莓应出现在新列表中),会发生什么?这意味着fruitType参数可以作为&#34; All&#34;,它不会根据该标准过滤掉任何水果。
但是,列表中的水果不具有&#34;所有&#34;的所有&#34;因此,过滤器将不会返回任何结果,因为没有水果具有该值&#34;所有&#34;我看到这样的事情:
query = fruitColor == "All" ? query : query.Where(x => x.fruitColor == fruitColor);
query = fruitType == "All" ? query : query.Where(x => x.typeOfFruit == fruitType);
以这种方式构建查询,但是我不知道这个&#34;查询&#34;是。它是一个字符串?或者是否有某种&#34;查询&#34;我可以用来构建查询表达式的类吗?
答案 0 :(得分:3)
处理 ALL 水果类型的简单修改将是......
List<Fruit> newFruits = allFruits.Where(f => f.typeOfFruit == fruitType || fruitType == "All")
.Where(f => f.fruitColor == fruitColor).ToList();
f.typeOfFruit == fruitType || fruitType == "All"
部分将分别处理水果OR
所有类型水果的特定标准
您的LINQ可以进一步简化为
List<Fruit> newFruits = allFruits
.Where(f => (f.typeOfFruit == fruitType || fruitType == "All")
&& f.fruitColor == fruitColor).ToList();
答案 1 :(得分:1)
答案 2 :(得分:0)
这演示了如何动态构建linq查询:
public List<Fruit> getFruitList(List<Fruit> allFruits, string fruitType, string fruitColor)
{
IEnumerable<Fruit> newFruits = allFruits;
if(fruitType != "All")
{
newFruites = newFruits.Where(f => f.typeOfFruit == fruitType);
}
if(fruitColor != "All")
{
newFruits = newFruits.Where(f => f.fruitColor == fruitColor);
}
return newFruits.ToList();
}
答案 3 :(得分:0)
这应该可以解决问题,只需为你不想过滤的参数传递一个空字符串或空字符串
public List<Fruit> getFruitList(List<Fruit> allFruits, string fruitType, string fruitColor) {
bool filterByFruitType = !string.IsNullOrEmpty(fruitType);
bool filterByFruitColor = !string.IsNullOrEmpty(fruitColor);
// both type and color
if (filterByFruitType && filterByFruitColor) {
return allFruits.Where(f => f.typeOfFruit == fruitType)
.Where(f => f.fruitColor == fruitColor).ToList();
}
// color only
else if (!filterByFruitType && filterByFruitColor) {
return allFruits.Where(f => f.fruitColor == fruitColor).ToList();
}
// type only
else if (filterByFruitType && !filterByFruitColor) {
return allFruits.Where(f => f.typeOfFruit == fruitType).ToList();
}
// no filter
else {
return allFruits;
}
}
&#13;