2011-11-18 59 views
1

我有這樣的代碼:如何連接列表<type>?

protected IList<MyObject> offerte; 

offerte = offerte.Union(from MyObject object in MyObjects 
         select object).ToList(); 

,但我得到一個System.ArgumentNullException(也許是因爲我加入一個IEnumerable的<>在列表<>)。

那麼,我該如何連接列表<>?

+0

你只是忘記初始化你的對象,你的代碼沒有錯。 –

+0

-1?爲什麼是-1?我無法理解那些贊成... – markzzz

+1

你的代碼有一個基本問題(或者在這裏是不完整的):你的對象在聲明後缺少初始化,這就是你的異常的原因。下面的答案針對你的第二個問題:LINQ中Union和Concat的區別,這更有趣! :)只是適當地編輯你的帖子,它不會被低估(希望) –

回答

7

聯合不是拼接,請檢查:http://msdn.microsoft.com/en-us/library/bb341731.aspx。例如,具有相同值的2組的聯合會產生相同的精確集合。

你需要的是Concat(驚奇,驚奇):

offerte = offerte.Concat(from MyObject object in MyObjects 
        select object).ToList(); 

然而,ArgumentNullException仍然會發生,導致offerte未初始化(檢查devdigital的回答)。

+0

其實很奇怪。隨着我的代碼(我認爲是錯誤的)我與IEnumerable結合列表。然後,與合併的結果(半列表,一半Ienumerable)我轉換整個列表?它很奇怪imo ... – markzzz

+0

這並不奇怪。 List也實現IEnumerable ,而Concat是IEnumerable的擴展方法。 – Bartosz

+0

呃,也許我不知道List/IList/IEnumerable是如何協同工作的。任何好的教程? – markzzz

4

你會得到例外,因爲offerte爲空。請嘗試:

offerte = new List<MyObject>(MyObjects); 
1

試試這個...

protected IList<MyObject> offerte = new List<MyObject>(MyObjects); 

// do your stuff 
2

聯盟和連鎖之間的主要區別是當你認爲你的數據是集合或序列。

在聯盟的情況下,你將合併兩組數據,這意味着如果你有兩個列表中一個值比將保持只有一次,因此合併{1, 2, 3}{2, 3, 4}給你{1, 2, 3, 4}(前提是您的自定義數據類型實現選擇恰當的接口並重寫散列函數以啓用LINQ中的相等性比較)。

如果你想連接你的數據,那麼第二部分將被追加到第一個標準桿,你將得到{1, 2, 3, 2, 3, 4}

你想要對你的數據做什麼?

P.S.你不能得到半Enumerable和半列表,每個List是一個IEnumerable,因爲List實現了這個接口。由於LINQ被懶惰地評估,你只會得到一個查詢。在你的情況下,你可以通過調用.ToList()方法強制進行急切的評估。

+0

當我回答另一個答案時,我不知道List/IList/IEnumerable是如何協同工作的。任何好的教程? – markzzz

+0

LINQ基本上在兩個接口IEnumerable和IQuereable上運行,而不是類型。所以,實現IEnumerable的所有東西也都支持LINQ。如果你想看看哪些數據類型實現IEnumerable。如果你想我可以爲你編譯這些列表。 –

+0

但它意味着在兩個接口上運行?它基本上將數據作爲List或IEnumerable存儲在集合中。這就是我不明白的東西(比如IList只是List的接口!!?!?)。 – markzzz