我有一种情况需要迭代一个集合,并使用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
答案 0 :(得分:1)
如果两个序列都应通过索引链接,则可以使用Enumerable.Zip
:
ProductList = ProductList.Zip(GetPartData()
, (product, part) => new Product
{
Car = product.Car,
Part = part
})
.ToList();
答案 1 :(得分:0)
基本上,您需要一次枚举两个IEnumerable
以匹配两者中的项目。 ProductList
和GetPartData
的结果。
// The two IEnumerable
var products = ProductList;
var parts = GetPartData();
foreach((product, part) in (products, parts)) // will not work :(
{
product.Part = part;
}
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
被执行。