我正在尝试合并两个列表..当我将ProductsList1.Product.Id
与ProductList2.Product.Id
合并时,我经常成功完成此操作,但在这种情况下,它更像ProductsList.Product.Id
{ {1}}。第3级属性就是让我感受到的!
ProductCategoriesList.ProductCategory.ProductId
答案 0 :(得分: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
<强>解释强>
ProductId
汇总ProductCategory
数据您可以使用Linqpad和result.Dump()
运行它,将提供最终结果的清晰视图
答案 1 :(得分: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));
输出:
3
0
我不知道使用交叉方法是否有更简单的方法,但这个方法确实有效!
根据documentation(使用Enumerable.Intersect
),您需要使用多种类型实现自定义IEqualityComparer。因此,目前不可能做这样的事情,或者简单地采用比我当前解决方案更多的代码行。
如果您想了解Enumerable.Intersect
的更多信息,建议您访问dotnetperls.com!