Phi*_*yNJ 5 c# linq delegates func
为了更多地了解Func Delegates和Expression树,我将一个简单的例子放在一起,但是我没有得到我期望的结果.下面是我的代码,它有一个Func,需要一个Params类和一个产品列表.我们的想法是将Params类应用为针对产品列表的过滤器.正如我所说,这只是我练习如何运作的练习.
我期望委托返回至少一个Product对象,但它返回null.
static void Main(string[] args)
{
Products products = CreateProducts();
Params param = new Params { Val = "ABC"};
Func<Params, Products, IEnumerable<Product>> filterFunc =
(p, r) => r.Where(x => x.Sku == p.Val).AsEnumerable();
Products prods = filterFunc(param, products).ToList() as Products;// returns null
}
private static Products CreateProducts()
{
return new Products
{
new Product{
Price = 25.00,
Sku = "ABC"
},
new Product{
Price = 134.00,
Sku = "DEF"
}
};
}
Run Code Online (Sandbox Code Playgroud)
类别:
public class Params
{
public String Val { get; set; }
}
public class Products : List<Product>
{
}
public class Product
{
public String Sku { get; set; }
public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是ToList返回a List<Product>,但这是一种截然不同的类型Products.你可以提供一个Products接受IEnumerable<Product>这样的构造函数:
public class Products : List<Product> {
public Products(IEnumerable<Product> products) : base(products) {
}
}
Products prods = new Products(filterFunc(param, products));
Run Code Online (Sandbox Code Playgroud)
但是,如果这是你的所有Products类,那么完全摆脱它并处理IEnumerable<Product>(或List<Product>)处理Product对象集合的任何地方可能要简单得多:
IEnumerable<Product> products = CreateProducts();
Params param = new Params { Val = "ABC"};
Func<Params, IEnumerable<Product>, IEnumerable<Product>> filterFunc =
(p, r) => r.Where(x => x.Sku == p.Val);
IEnumerable<Product> prods = filterFunc(param, products);
private static IEnumerable<Product> CreateProducts()
{
return new Products[] {
new Product{
Price = 25.00,
Sku = "ABC"
},
new Product{
Price = 134.00,
Sku = "DEF"
},
};
}
Run Code Online (Sandbox Code Playgroud)