2

さまざまな方法で複数のオファーが割り当てられたオブジェクトがあります。オファーは正確に 1 つの製品に対するものであり、オブジェクトには複数のオファーがあります。ここで、製品が一度だけ含まれる特定のビジネス ロジックに従うオブジェクトのすべてのオファーが必要です。

現時点では、次のように実装しました。

List<Offer> offers = new List<Offer>();
List<Product> products = new List<Product>();                
this.AddOffersToList(offers, products, ov.Offers.Where(o => o.OfferType == composedOffer));
this.AddOffersToList(offers, products, ov.Offers.Where(o => o.OfferType == simpleOffer));
this.AddOffersToList(offers, products, ov.ComposedOfferList.Offers);
this.AddOffersToList(offers, products, ov.SimpleOfferList.Offers);

AddOffersToList メソッド:

private void AddOffersToList(List<Offer> offers, List<Product> products,IEnumerable<Offer> newOffers)
{
    foreach (Offer offer in newOffers)
    {
        // add offer only if the product is not contained yet
        if (!products.Contains(offer.Product))
        {
            offers.Add(offer);
            products.Add(offer.Product);
        } 
    }
}

これは、最もエレガントでパフォーマンスの高い方法ではないようです。「制約」は、AddOffersToList メソッド呼び出しの順序と、製品が 1 回だけ含まれることです。

この問題をよりよく解決するのに役立つものは何でも大歓迎です!

4

1 に答える 1

1

このコードは、私が信じているものと「同等」です。

var offers = ov.Offers.Where(o => o.OfferType == composedOffer)
    .Concat(ov.Offers.Where(o => o.OfferType == simpleOffer))
    .Concat(ov.ComposedOfferList.Offers)
    .Concat(ov.SimpleOfferList.Offers)
    .GroupBy(offer => offer.Product)
    .Select(group => group.First())
    .ToList();

var products = offers.Select(offer => offer.Product).ToList();
于 2012-11-17T19:30:17.150 に答える