Проблема слияния IEnumerable <T>с использованием лямбда-выражений - PullRequest
2 голосов
/ 23 августа 2011

У меня есть 2 IEnumerables типа 'Product' - totalProducts и ProductsChosen. Как следует из названия, totalProducts содержит все доступные продукты, а ProductsChosen - продукты, выбранные пользователем.

Класс Product имеет свойства Id, number и IEnumerable<AdditonalOptions> options.

Я пытаюсь объединить эти 2 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))));
}

Я использовал код для слияния с здесь

Этот код работает нормально, только если я рассматриваю идентификаторы продуктов, но я также хотел бы объединить IEnumerable<AdditionalOption> options из productsChosen с идентификатором totalProducts, если идентификаторы продуктов совпадают. Но я не уверен, как сделать это.

Может кто-нибудь помочь мне с этим?

Спасибо

1 Ответ

2 голосов
/ 24 августа 2011

Поскольку выбранные товары имеют разные варианты, то у всех товаров они должны быть отдельными экземплярами. Поскольку вы сказали, что все доступные продукты - это все, то я предполагаю, что набор выбранных идентификаторов продуктов должен быть подмножеством идентификаторов продуктов.

Кроме того, поскольку выбранные продукты являются отдельными экземплярами, возможно, что на каждый общий продукт может быть ноль или более выбранных продуктов, поэтому мое решение работает и для этого случая. Это будет одинаково работать, если есть только ноль или один.

Кроме того, поскольку они являются отдельными экземплярами и , свойство 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, но это легко изменить.

У вас это работает?

...