使用 Lambda 表达式合并 IEnumerable 时出现问题
本文关键字:问题 Lambda 表达式 合并 IEnumerable 使用 | 更新日期: 2023-09-27 18:06:38
>我有 2 个 IEnumerables,其类型为"产品" - 总计产品和产品已选择。顾名思义,totalProducts包含所有可用的产品,而产品选择包含用户选择的产品。
产品类具有属性 Id
、 number
和 IEnumerable<AdditonalOptions> options
。
我正在尝试像这样合并这两个 IEnumerables
public IEnumerable<Product> MergeProducts(IEnumerable<Product> Products, IEnumerable<Product> ProductsChosen)
{
return ProductsChosen.Concat(Products.Where(r => !ProductsChosen.Any(x => x.ProductId.Equals(r.ProductId))));
}
我使用代码从这里合并
仅当我考虑产品 ID 时,此代码才能正常工作,但如果产品 ID 相同,我还想将productsChosen
的IEnumerable<AdditionalOption> options
与totalProducts
的合并。但我不确定该怎么做。
有人可以帮我吗?
谢谢
由于所选产品具有不同的选项,因此总产品必须是不同的实例。既然您已经说过所有可用的产品总数,那么我假设所选产品 ID 集必须是产品 ID 的子集。
此外,由于所选产品是不同的实例,因此每个总产品可能零个或多个所选产品,因此我的解决方案也适用于这种情况。如果只有零或一,它同样有效。
此外,由于它们是不同的实例,并且 options
属性是一种IEnumerable
因此,为合并的产品创建一组新的实例对我来说是有意义的,以免更改原始的总产品集。
public IEnumerable<Product> MergeProducts(
IEnumerable<Product> Products,
IEnumerable<Product> ProductsChosen)
{
return
from p in Products
join pc in ProductsChosen on p.Id equals pc.Id into pcs
select new Product()
{
Id = p.Id,
number = p.number,
options = p.options
.Concat(
from pc2 in pcs
from ao in pc2.options
select ao).ToArray(),
};
}
您没有解释属性是什么number
所以我只是从Products
列表中为这个值做了一个简单的赋值,而忽略了ProductsChosen
列表中的这个值。
另外,您没有说AdditionalOptions
需要如何合并。这不是枚举Merge
方法。您需要使用 Concat
或 Union
之类的东西来进行合并。我选择了Concat
,但这很容易改变。
这对你有用吗?