LƯU Ý: Ngay trước khi đăng câu hỏi này nó xảy ra với tôi có một cách tốt hơn để làm những gì tôi đã cố gắng để hoàn thành (và tôi cảm thấy khá ngu ngốc về nó):Tôi đang thiếu gì trong chuỗi các biến vị ngữ này?
IEnumerable<string> checkedItems = ProductTypesList.CheckedItems.Cast<string>();
filter = p => checkedItems.Contains(p.ProductType);
Vì vậy, OK, vâng, tôi đã nhận ra điều này. Tuy nhiên, tôi vẫn đăng câu hỏi, bởi vì tôi vẫn không hiểu tại sao những gì tôi (ngu ngốc) cố gắng để không hoạt động.
Tôi nghĩ điều này sẽ cực kỳ dễ dàng. Hóa ra nó khiến tôi đau đầu.
Ý tưởng cơ bản: hiển thị tất cả các mục có giá trị thuộc tính ProductType
được chọn trong CheckedListBox
.
Việc thực hiện:
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;
}
Tuy nhiên, nói các mục "Vốn chủ sở hữu" và "ETF" đều được kiểm tra trong ProductTypesList
(một CheckedListBox
). Sau đó, đối với một số lý do, đoạn mã sau chỉ trả lại sản phẩm thuộc loại "ETF":
var filter = GetProductTypeFilter();
IEnumerable<Product> filteredProducts = allProducts.Where(filter);
tôi đoán nó có thể có một cái gì đó để làm với một số hỗn độn tự tham khảo nơi filter
được thiết lập để, về cơ bản, bản thân hoặc thứ khác. Và tôi nghĩ rằng có thể sử dụng ...
filter = new Func<Product, bool>(p => (prevFilter(p) || p.ProductType == pt));
... sẽ thực hiện thủ thuật, nhưng không may mắn như vậy. Ai có thể nhìn thấy những gì tôi đang thiếu ở đây?
Vâng, điều đó có ý nghĩa hoàn hảo. Cảm ơn! –