使用Func委托返回值

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)

p.s*_*w.g 7

问题是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)