2011-08-23 116 views
2

我有2個IEnumerables其是類型「產品」的 - totalProducts和ProductsChosen。正如名稱所示,產品中包含所有可用產品,所選產品包含用戶選擇的產品。問題合併的IEnumerable <T>使用lambda表達式

產品分類具有屬性Id,numberIEnumerable<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)))); 
} 

我用代碼從here

此代碼工作正常只有當我考慮的產品ID合併,但我也想合併productsChosen與該totalProductsIEnumerable<AdditionalOption> options如果產品ID same.But我不知道該怎麼做。

可能有人請幫助我嗎?

由於

+3

改爲使用「聯合()」方法 - 儘管concat是可接受的答案,正如您在選票中看到的那樣,聯盟是首選 – Smudge202

+0

改進的標籤列表以吸引更多的意見 – AakashM

+1

我認爲這個問題需要澄清。我的解釋是,你正在尋找找到'產品'這兩個集合的聯合,並且'產品'的結果是你想要'AdditionalOptions'的聯合。那是對的嗎? –

回答

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但很容易改變。

這是否適合您?