Linq迭代一个集合并向其成员添加另一个集合

时间:2015-07-01 11:57:04

标签: c# linq

我有一种情况需要迭代一个集合,并使用Linq将另一个集合添加到其成员之一。

例如我有这个课程

public class Product
{
    public string Car { get; set; }
    public IEnumerable<Part> Part { get; set; }
}

此课程将在

之类的集合中
IEnumerable<Product> ProductList

如何使用Part使用Linq填充每个Product的{​​{1}} - 属性

GetPartData()

最终,我的private IEnumerable<IEnumerable<Part>> GetPartData() { return new List<List<Part>>() { new List<Part>{ new Part(){PartType="11",PartValue=1}, new Part(){PartType="12",PartValue=2} }, new List<Part>{ new Part(){PartType="21",PartValue=1}, new Part(){PartType="22",PartValue=2} } }; } 应该等于ProductList[0].Part

2 个答案:

答案 0 :(得分:1)

如果两个序列都应通过索引链接,则可以使用Enumerable.Zip

ProductList = ProductList.Zip(GetPartData()
    , (product, part) => new Product
    {
        Car = product.Car,
        Part = part
    })
.ToList();

答案 1 :(得分:0)

基本上,您需要一次枚举两个IEnumerable以匹配两者中的项目。 ProductListGetPartData的结果。

// The two IEnumerable
var products = ProductList;
var parts = GetPartData();

foreach((product, part) in (products, parts))  // will not work :(
{
    product.Part = part;
}

解决方案has been debated before

Zip方法可以做到。

// The two IEnumerable
var products = ProductList;
var parts = GetPartData();

products.Zip(parts, (product, part) => product.Part = part).ToList();

ToList() 非常重要force the execution

如果你对lambda不满意,你可以这样做:

// The two IEnumerable
var products = ProductList;
var parts = GetPartData();

products.Zip(parts, ProductPartAssociation).ToList();

...

Product ProductPartAssociation(Product product, IEnumerable<Part> part)
{
   product.Part = part;
   return product;      // Actually not used.
}

Zip的结果是IEnumerable函数返回的ProductPartAssociation。你不关心它,因为你需要的只是确保ProductPartAssociation被执行。