注:この質問を投稿する直前に、私が達成しようとしていたことを行うためのより良い方法があることに気づきました(そして、私はそれについてかなり愚かだと感じています):
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));
...うまくいきますが、そのような運はありません。ここで私が見逃しているものを見ることができますか?