c#在运行时过滤对象列表

时间:2015-01-15 05:13:47

标签: c#

我有一个我想根据一些信息过滤的对象列表。例如,可能具有不同水果的水果列表。从这个水果列表中我想获得一个符合特定标准的唯一水果的新列表。

我有:

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;我可以用来构建查询表达式的类吗?

4 个答案:

答案 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)

如果您使用的是System.Linq,那么它应该是IQueryable。您可以看到文档here

修改:添加Enumerable.Where文档here

答案 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)

这应该可以解决问题,只需为你不想过滤的参数传递一个空字符串或空字符串

&#13;
&#13;
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;
&#13;
&#13;