2016-11-16 45 views
0

我試圖合併兩個列表。我經常這樣做成功的時候我已經合併類似ProductsList1.Product.IdProductList2.Product.Id,但是在這種情況下,它更像是ProductsList.Product.IdProductCategoriesList.ProductCategory.ProductId。第三級屬性是什麼讓我!LINQ的 - 通過性能兒童相交2所列出對象

// LIST OF PRODUCTS IN RESULT SETS 
    List<Product> products = new List<Product>(); 
    products.Add(new Product() { Id = 1 }); 
    products.Add(new Product() { Id = 2 }); 

    // LIST OF ALL PRODUCTS AND THEIR CATEGORY TAXONOMIES 
    List<ProductCategory> allProductCategories = new List<ProductCategory>(); 
    allProductCategories.Add(new ProductCategory() { ProductId = 1, CategoryUid = 101, ParentCategoryUid = 30 }); 
    allProductCategories.Add(new ProductCategory() { ProductId = 1, CategoryUid = 30, ParentCategoryUid = 2 }); 
    allProductCategories.Add(new ProductCategory() { ProductId = 1, CategoryUid = 2, ParentCategoryUid = 1 }); 
    allProductCategories.Add(new ProductCategory() { ProductId = 3, CategoryUid = 101, ParentCategoryUid = 43 }); 
    allProductCategories.Add(new ProductCategory() { ProductId = 3, CategoryUid = 43, ParentCategoryUid = 8 }); 
    allProductCategories.Add(new ProductCategory() { ProductId = 3, CategoryUid = 8, ParentCategoryUid = 1 }); 

    // NEED TO MERGE THE 2ND LIST INTO THE 1ST BY PRODUCTID VIA SQL EQUIV INNER JOIN 
    // END RESULT SHOULD BE products list has 2 objects. one object has 1 list product category with 3 child objects 
    // THIS IS THE CLOSEST I GOT 
    products.Select(x => x.Id).Intersect(allProductCategories.Select(a => a.ProductId).ToList()); 
} 

public class Product 
{ 
    private int _id; 
    private List<ProductCategory> _productCategories; 

    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public List<ProductCategory> ProductCategories 
    { 
     get { return _productCategories; } 
     set { _productCategories = value; } 
    } 
} 

public class ProductCategory 
{ 
    private int _productId; 
    private int _categoryUid; 
    private int _parentCategoryUid; 

    public int ProductId 
    { 
     get { return _productId; } 
     set { _productId = value; } 
    } 

    public int CategoryUid 
    { 
     get { return _categoryUid; } 
     set { _categoryUid = value; } 
    } 

    public int ParentCategoryUid 
    { 
     get { return _parentCategoryUid; } 
     set { _parentCategoryUid = value; } 
    } 
} 
+0

第一個和第二個列表不是同一類型,因此您如何計劃合併它們?你試圖達到什麼樣的最終結果,即什麼類型的列表? –

+0

好的,我看到你在代碼塊中繼續提出你的問題作爲評論。如果你將來不這樣做,可能是最好的。這就是說,從你的評論中我不清楚最終的結果應該是什麼。 –

回答

0
// LIST OF PRODUCTS IN RESULT SETS 
List<Product> products = new List<Product> { 
    new Product() {Id = 1, ProductCategories = new List<ProductCategory>()}, 
    new Product() {Id = 2, ProductCategories = new List<ProductCategory>()} 
}; 

// LIST OF ALL PRODUCTS AND THEIR CATEGORY TAXONOMIES 
List<ProductCategory> allProductCategories = new List<ProductCategory> 
{ 
    new ProductCategory() {ProductId = 1, CategoryUid = 101, ParentCategoryUid = 30}, 
    new ProductCategory() {ProductId = 1, CategoryUid = 30, ParentCategoryUid = 2}, 
    new ProductCategory() {ProductId = 1, CategoryUid = 2, ParentCategoryUid = 1}, 
    new ProductCategory() {ProductId = 3, CategoryUid = 101, ParentCategoryUid = 43}, 
    new ProductCategory() {ProductId = 3, CategoryUid = 43, ParentCategoryUid = 8}, 
    new ProductCategory() {ProductId = 3, CategoryUid = 8, ParentCategoryUid = 1} 
}; 

// General logic going on here: 
// Add all ProductCategory where the ProductID is equal 
// to the Prdoduct.ID to the current Product.ProductCategories 
products.ForEach(pr=> 
    allProductCategories.Where(pC=> 
     pC.ProductId.Equals(pr.Id)).ToList().ForEach(pC=> 
      pr.ProductCategories.Add(pC))); 

// products.ToList().ForEach(x=>Console.WriteLine(x.ProductCategories.Count)); 

輸出:


我不知道使用交叉方法是否有更簡單的方法,但是這個方法確實有效!

根據documentation(使用Enumerable.Intersect),您需要使用多種類型實現自定義IEqualityComparer。因此,目前不可能做這樣的事情,或者簡單地採用比我當前的解決方案更多的代碼行。

如果你想知道更多關於Enumerable.Intersect,我建議訪問dotnetperls.com

2

下面的查詢將做的工作:

var result = products.Join(allProductCategories, p => p.Id, 
           pc => pc.ProductId, (p, pc) => new { p, pc}) 
          .GroupBy(x => x.p.Id) 
          .Select(x => new Product{ Id = x.Key, ProductCategories = x.Select(y => y.pc).ToList()}); 

要求:

  • 從兩個不同的名單,其中有共同的標識獲取數據,並創建一個合併版本,其中包含父代Product的Id以及所有匹配的行ProductCategory

說明:

  • 內加入的ID兩個列表
  • GROUPBY ProductId來彙總ProductCategory數據
  • 在單獨收集,其中ID是關鍵,數據選擇它們是所有集合彙總/分組結果

您可以使用Linqpad和result.Dump()運行它,將提供最終結果的清晰視圖t

+0

我稍微遵循這個解決方案,但我很難得到結果的類型列表 Paul

+0

現在檢查,我編輯了響應產生'IEnumerable '作爲迴應,早些時候我創建了一個IEnumerble ',這是一個非常小的變化 –