ПРИМЕЧАНИЕ : Прямо перед публикацией этого вопроса мне пришло в голову, что есть лучший способ сделать то, что я пытался достичь (и я чувствую себя довольно глупо):
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));
... сделал бы трюк, но не такая удача. Кто-нибудь может увидеть, чего мне здесь не хватает?