HINWEIS: Kurz vor dieser Frage Entsendung es fiel mir ein, gibt es eine bessere Art und Weise zu tun, was ich (und ich fühle mich ziemlich dumm darüber) zu erreichen versuchte:Was fehlt mir in dieser Kette von Prädikaten?
IEnumerable<string> checkedItems = ProductTypesList.CheckedItems.Cast<string>();
filter = p => checkedItems.Contains(p.ProductType);
So OK, ja, ich erkenne das schon. Wie auch immer, ich poste die Frage trotzdem, weil ich immer noch nicht ganz verstehe, warum was ich war (dumm) versuchte, zu tun, funktionierte nicht.
Ich dachte, das wäre extrem einfach. Stellt sich heraus, dass es mir ziemlich Kopfschmerzen bereitet.
Die Grundidee: Zeigen Sie alle Elemente an, deren ProductType
Eigenschaftswert in einem CheckedListBox
überprüft wird.
Die Umsetzung:
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;
}
Jedoch sagt die Elemente "Equity" und "ETF" wird überprüft sowohl in ProductTypesList
(a CheckedListBox
). Dann aus irgendeinem Grunde nur der folgende Code gibt Produkte vom Typ „ETF“:
var filter = GetProductTypeFilter();
IEnumerable<Product> filteredProducts = allProducts.Where(filter);
Ich vermuten, es könnte etwas gehabt hat, mit einiger selbst verweisende Unsauberkeit zu tun, wo filter
ist auf im Wesentlichen selbst oder etwas anderes. Und ich dachte, dass vielleicht mit ...
filter = new Func<Product, bool>(p => (prevFilter(p) || p.ProductType == pt));
... würde den Trick tun, aber kein solches Glück. Kann jemand sehen, was ich hier vermisse?
Nun, das macht Sinn. Vielen Dank! –