2012-11-17 76 views
2

我有一個對象,具有通過不同方式分配的多個商品。優惠僅適用於一種產品,而對象具有多種優惠。現在我想要一個對象的所有商品都遵循特定商業邏輯,即產品只包含一次。帶約束條件的Concat多個IEnumerables

在我已經實現如下所示的那一刻:

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

這段代碼與我相信的「相等」。

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(); 
+0

我認爲這段代碼沒有考慮到這個順序。如果我在ov.Offers.Where(o => o.OfferType == composedOffer)中有產品x,而且在我們說ov.SimpleOfferList.Offers中,獲取第一個結果中的優惠非常重要。 – niklr

+0

在編寫單元測試之後,我能夠證明你的代碼正在做我想做的事。非常感謝! :) – niklr