NOTE: droit avant de poster cette question, il me est apparu il y a une meilleure façon de faire ce que je voulais accomplir (et je me sens assez stupide à ce sujet):Qu'est-ce qui me manque dans cette chaîne de prédicats?
IEnumerable<string> checkedItems = ProductTypesList.CheckedItems.Cast<string>();
filter = p => checkedItems.Contains(p.ProductType);
Alors OK, oui, je déjà réaliser cela. Cependant, je poste la question de toute façon, parce que je ne comprends toujours pas pourquoi ce que j'étais (stupidement) en essayant à faire ne fonctionnait pas.
Je pensais que ce serait extrêmement facile. Il s'avère que cela me donne mal à la tête.
L'idée de base: afficher tous les éléments dont la valeur de la propriété ProductType
est vérifiée dans un CheckedListBox
.
La mise en œuvre:
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;
}
Cependant, disent les articles "Capitaux propres" et "ETF" sont tous deux sélectionnés dans ProductTypesList
(un CheckedListBox
). Ensuite, pour une raison quelconque, le code suivant renvoie uniquement des produits de type « ETF »:
var filter = GetProductTypeFilter();
IEnumerable<Product> filteredProducts = allProducts.Where(filter);
Je l'ai deviné aurait pu avoir quelque chose à voir avec une messiness auto-référentielle où filter
est réglé, essentiellement, se ou autre chose. Et je pensais que peut-être en utilisant ...
filter = new Func<Product, bool>(p => (prevFilter(p) || p.ProductType == pt));
... ferait l'affaire, mais pas de chance. Quelqu'un peut-il voir ce qui me manque ici?
Eh bien, c'est tout à fait logique. Merci! –