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

时间:2011-08-23 16:36:02

标签: c# linq ienumerable linq-to-objects

我有2个IEnumerables,类型为'Product' - totalProducts和ProductsChosen。顾名思义,totalProducts拥有所有可用的产品,而且ProductsChosen拥有用户选择的产品。

Product类包含属性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))));
}

我已使用代码从here

进行合并

此代码仅在我考虑产品ID时才能正常工作,但如果产品ID相同,我还想将IEnumerable<AdditionalOption> options的{​​{1}}与productsChosen的{​​{1}}合并。但我不知道该怎么做。

有人可以帮助我吗?

由于

1 个答案:

答案 0 :(得分:2)

由于所选产品具有不同的选项,因此总产品必须是不同的实例。既然您已经说过所有可用的产品,那么我认为所选产品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但很容易改变。

这对你有用吗?