使用 Lambda 表达式合并 IEnumerable 时出现问题

本文关键字:问题 Lambda 表达式 合并 IEnumerable 使用 | 更新日期: 2023-09-27 18:06:38

>我有 2 个 IEnumerables,其类型为"产品" - 总计产品和产品已选择。顾名思义,totalProducts包含所有可用的产品,而产品选择包含用户选择的产品。

产品类具有属性 IdnumberIEnumerable<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 相同,我还想将productsChosenIEnumerable<AdditionalOption> optionstotalProducts的合并。但我不确定该怎么做。

有人可以帮我吗?

谢谢

使用 Lambda 表达式合并 IEnumerable<T> 时出现问题

由于所选产品具有不同的选项,因此总产品必须是不同的实例。既然您已经说过所有可用的产品总数,那么我假设所选产品 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方法。您需要使用 ConcatUnion 之类的东西来进行合并。我选择了Concat,但这很容易改变。

这对你有用吗?