注意:在发布这个问题之前,我突然想到有一种更好的方法来做我想要完成的事情(我对此感到很愚蠢):
IEnumerable<string> checkedItems = ProductTypesList.CheckedItems.Cast<string>();
filter = p => checkedItems.Contains(p.ProductType);
好吧,是的,我已经意识到了这一点。但是,无论如何我都会发布这个问题,因为我仍然不太明白为什么我(愚蠢地)尝试做的事情没有奏效。
我认为这将非常容易。原来这让我很头疼。
基本思想:显示所有ProductType
属性值被选中的项目CheckedListBox
。
实施:
private Func<Product, bool> GetProductTypeFilter() {
// if nothing is checked, display nothing
Func<Product, bool> filter = p => false;
foreach (string pt in ProductTypesList.CheckedItems.Cast<string>()) {
Func<Product, bool> prevFilter = filter;
filter = p => (prevFilter(p) || p.ProductType == pt);
}
return filter;
}
但是,假设项目“Equity”和“ETF”都在ProductTypesList
(a CheckedListBox
) 中签入。然后由于某种原因,以下代码仅返回“ETF”类型的产品:
var filter = GetProductTypeFilter();
IEnumerable<Product> filteredProducts = allProducts.Where(filter);
我猜它可能与一些自我引用的混乱filter
有关,本质上,它本身或其他东西。我想也许使用...
filter = new Func<Product, bool>(p => (prevFilter(p) || p.ProductType == pt));
......会做的伎俩,但没有这样的运气。任何人都可以看到我在这里缺少什么吗?