首页 文章

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

提问于
浏览
0

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

我有:

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参数可以作为“All”,它不会根据该条件过滤掉任何水果 .

但是,列表中的水果没有“全部”的typeOfFruit值,因此过滤器将不返回任何结果,因为没有水果具有该值“全部”

我看到这样的事情:

query = fruitColor == "All" ? query : query.Where(x => x.fruitColor == fruitColor);
query = fruitType == "All" ? query : query.Where(x => x.typeOfFruit == fruitType);

并以这种方式构建查询,但我不知道这个“查询”是什么类型的对象 . 它是一个字符串?或者是否有某种“查询”类可用于构建查询表达式?

4 回答

  • 3

    这应该是技巧,只需为您不想过滤的参数传递null或空字符串

    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;
    	}
    }
    
  • 0

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

    编辑:添加 Enumerable.Where documentation here .

  • 1

    一个简单的修改,以照顾 ALL 水果类型将..

    List<Fruit> newFruits = allFruits.Where(f => f.typeOfFruit == fruitType || fruitType == "All")
                                   .Where(f => f.fruitColor == fruitColor).ToList();
    

    f.typeOfFruit == fruitType || fruitType == "All" 部分将分别处理水果的特定标准 OR All

    您的LINQ可以进一步简化为

    List<Fruit> newFruits = allFruits
                            .Where(f => (f.typeOfFruit == fruitType || fruitType == "All") 
                                     && f.fruitColor == fruitColor).ToList();
    
  • 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();
    }
    

相关问题