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