2013-04-18 38 views
0

假設我有以下幾點:選擇與關聯的字符串值子列表

public class ClassA 
{ 
    public string Description {get;set;} 
    public List<Product> Products {get;set;} 
} 

public class ClassB 
{ 
    public string Description {get;set;} 
    public Product SingleProduct {get;set;} 
} 

public class ClassC 
{ 
    public List<ClassA> ListOfAs {get;set;} 
    public List<ClassB> BreakDownListOfAs() 
    { 
     // This is the critical point 
    } 
} 

在標示爲關鍵點,我想回到從檢查ListOfAs並把它分解,從而產生ClassB實例的列表ClassB的每個實例都有一個單一產品,並且其中Product所在的ClassA實例中的Description

例如,如果我有:

var ListOfAs = new List<ClassA> { 
    new ClassA { 
     Description = "foo", 
     Products = new List<Product> { p1, p2 } 
    }, 
    new ClassA { 
     Description = "bar", 
     Products = new List<Product> { p3, p4 } 
    } 
}; 

隨後的ClassC.BreakDownListOfAs()返回值應符合:

new List<ClassB> { 
    new ClassB { Description = "foo", Product = p1 }, 
    new ClassB { Description = "foo", Product = p2 }, 
    new ClassB { Description = "bar", Product = p3 }, 
    new ClassB { Description = "bar", Product = p4 }, 
} 

我知道,我通常會使用.SelectMany()投射子表,但我無法解決如何使用父對象中的字符串實現投影子元素的組合。

回答

3

在LINQ方法鏈,它應該是這樣的:

return ListOfAs 
    .SelectMany(a => a.Products, 
       (a, p) => new ClassB 
           { 
            Description = a.Description, 
            SingleProduct = p 
           }) 
    .ToList(); 

的技巧是同時使用創建的結果選擇對象來自ClassA實例的描述和來自ClassA列表的產品。

+1

啊哈,我不知道.SelectMany(collectionSelector,resultSelector)重載。謝謝! –

3

使用LINQ語法這是相當簡單:

var query = from a in listOfAs 
      from p in a.Products 
      select new ClassB 
      { 
       Description = a.Description, 
       SingleProduct = p 
      }; 

var result = query.ToList(); 
+0

此外,雖然我更喜歡鏈式語法。 –

1
IEnumerable<ClassB> breakdown = 
    ListOfAs.Select(a => a.Products.Select(
         p => new ClassB { Description = a.Description, 
              SingleProduct = p })) 
    .SelectMany(b => b); 
+0

對可讀性方面的嵌套.Select()段不那麼熱衷,但是正確的。 –

+0

@MattSach是的,Fls'Zen的答案更清晰。 –