使用Lambda循环IEnumerable

时间:2017-05-25 14:15:17

标签: c# func

我有一个看起来像下面的功能

cal.set(Calendar.HOUR_OF_DAY, 0):

我正在寻找一个带有多个项目的功能。我正在尝试如下,但这不正确......你能帮我解决一下这个问题吗?

Func<Product, bool> ItemProduct(Iitem item) => (pro)=> pro.ItemID == item.Id;

2 个答案:

答案 0 :(得分:1)

从评论中,您可能实际上想要生成一个函数,该函数将拥有Iitem的枚举并将Product作为参数,并将返回其所有Iitem } IdItemID的{​​{1}}匹配。就是这样:

Product

像这样使用:

Func<Product, IEnumerable<Iitem>> ItemProduct(IEnumerable<Iitem> items) =>
    pro => items.Where(item => pro.ItemID == item.Id);

我会在这里留下我最初的猜测,因为我仍然不确定你真正想要的是什么。

如果var someItems = new [] { new Iitem { Id = 1 }, new Iitem { Id = 2 } }; var f = ItemProduct(someItems); var prod = new Product { ItemID = 1; } // Results will be an enumeration that will enumerate a single Iitem, the // one whose Id is 1. var results = f(prod); 中的所有 ID与作为参数传入的items的{​​{1}}匹配,此方法将返回一个返回true的函数:

ItemID

像这样:

Product

如果你希望函数返回true,如果至少有一个ID匹配,但不一定全部匹配,那么这样就可以了。唯一的区别是Func<Product, bool> ItemProduct(IEnumerable<Iitem> items) => (pro) => items.All(item => pro.ItemID == item.Id); 更改为var product = new Product() { ItemID = 1 }; var itemColl1 = new Iitem[] { new Iitem { Id = 1 }, new Iitem { Id = 2 } }; var itemColl2 = new Iitem[] { new Iitem { Id = 1 }, new Iitem { Id = 1 } }; var f1 = ItemProduct(itemColl1); var f2 = ItemProduct(itemColl2); bool thisWillBeFalse = f1(product); bool thisWillBeTrue = f2(product);

items.All()

像这样:

items.Any()

答案 1 :(得分:1)

假设您需要返回一个针对给定产品返回true的函数,如果给定集合中的所有项目与产品Id具有相同的ItemID,则表示您可以使用items.All(...)代替单个ID比较:

Func<Product, bool> ItemProduct1(IEnumerable<Iitem> items) 
    => (pro) => items.All(i => pro.ItemID == i.Id);

如果您true只匹配某些特定项目ItemID的产品需要Id,请改用items.Any(...)

Func<Product, bool> ItemProduct1(IEnumerable<Iitem> items) 
    => (pro) => items.Any(i => pro.ItemID == i.Id);