2015-07-01 98 views
0

我有一種情況,我需要迭代集合並使用Linq將其他集合添加到其成員之一。Linq遍歷一個集合並向其成員添加另一個集合

例如,我有這個類

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

這個類將是一個集合中像

IEnumerable<Product> ProductList 

我如何填充使用GetPartData()使用LINQ

每個 ProductPart -property
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應等於GetPartData()[0]

回答

1

如果兩個序列應通過索引鏈接,您可以使用Enumerable.Zip

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

謝謝@ tim-schmelter。考慮到除了「部分」之外我還會擁有很多屬性。有沒有更好的方法來做到這一點,否則我必須映射每個屬性。如果我可以使用Auto Mapper,我需要如何改進它。 – Frenz

0

基本上,你需要一次匹配從兩個項目枚舉2 IEnumerableProductListGetPartData的結果。

// 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

如果你不舒服的拉姆達,你可以做這樣的:

// 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. 
} 

拉鍊的結果是無論ProductPartAssociation函數返回的IEnumerable。你不關心它,因爲你需要的只是確保執行ProductPartAssociation

相關問題