2012-02-15 71 views
2

我有一個5個列表,其中有相同的對象。我只是想將它們全部與那些屬性完好地結合到一個更大的列表中。將5個列表<object>合併成一個列表<object>

我想到了一個辦法,但我認爲有更好的辦法。

List<object> blah = new List<object> 

foreach(object item in ObjectList1) 
{ 
    blah.Add(item); 
} 

如果你知道更好的方法來做到這一點讓我知道,在此先感謝!

+3

Whice .net框架? – 2012-02-15 18:02:46

+1

.NET中必須存在一些庫,例如Java中的Guava,它可以在不實際創建新列表的情況下呈現聚合視圖? – 2012-02-15 18:04:31

+1

「所有屬性完好無損」是什麼意思? – phoog 2012-02-15 18:07:40

回答

2
var result = ObjectList1.Concat(ObjectList2).Concat(ObjectList3). 
         Concat(ObjectList4).Concat(ObjectList5).ToList() 
+0

我認爲所有的答案都很好,但這是我最後使用的那個。我投了所有其他答案=)〜 – rreeves 2012-02-15 22:16:47

+0

這個答案與我的有什麼不同? – 2012-02-16 02:58:09

1

嘗試

ObjectList1.Concat(ObjectList2).Concat(ObjectList3).Concat(ObjectList4).Concat(ObjectList5).ToList()` 
5

你可以使用任何List<T>.AddRange()或LINQ:

foreach(var list in myLists) 
    bigList.AddRange(list); 
+1

如果OP已經有一個列表集合,他可以簡單地:'myLists.SelectMany(l => l)'。我的理解是他擁有不同的變量來保存列表。 – 2012-02-15 18:25:27

4

使用Enumerable.Concat()

List<object> blah = ObjectList1 
    .Concat(ObjectList2) 
    .Concat(ObjectList3) 
    // ... 
    .ToList(); 
1

我不知道你在這裏做什麼。也許你應該將對象投射到特定的對象上。該代碼看起來對我來說是正確的,但它有點奇怪。

1

爲了提高可讀性,我建議......

List<object> blah = new List<object> 
blah.AddRange(ObjectList1); 
blah.AddRange(ObjectList2); 
blah.AddRange(ObjectList3); 
blah.AddRange(ObjectList4); 
2

此代碼從你的問題:

:如果您使用 AddRange

List<object> blah = new List<object> 

foreach(object item in ObjectList1) 
{ 
    blah.Add(item); 
} 

...可能是更簡潔

List<object> blah = new List<object> 
blah.AddRange(ObjectList1); 

所以你可以加CA將AddRange添加5次或者將5個列表連接並將結果傳遞給AddRange。

目前尚不清楚你所說的「他們的所有屬性不變」的意思是什麼,但如果它意味着你的其他名單不同更具體的類型列表比object,則沒有,你不能創建單個列表,這將使您能夠對列表成員進行強類型訪問。

編輯

看來,「他們所有的性質不變」是指,在新的列表中的對象具有相同的屬性值在舊列表中的對象。當然他們會,因爲他們是相同的對象!該列表並不包含對象,畢竟它們包含引用(因爲object是引用類型)。新列表包含副本的引用,而不是對象的副本。

3

此功能...

static IEnumerable<T> Combine<T>(params IEnumerable<T>[] sources) { 
    return sources.SelectMany(s => s); 
} 

...可以這樣使用:

List<object> l1 = ... ; 
List<object> l2 = ... ; 
List<object> l3 = ... ; 
List<object> l4 = ... ; 
List<object> l5 = ... ; 

var result = Combine(l1, l2, l3, l4, l5).ToList(); 

BTW,省略ToList如果結果實際上並不需要是一個List

(當然這樣的工作將與任何名單的數量,而不是僅僅5)


或者,如果你只需要做一次,不希望引入只是對於全新的功能:

var result = new[] { l1, l2, l3, l4, l5 }.SelectMany(l => l).ToList(); 

或者,如果你關心性能超過可讀性,這樣做是爲了AVO內存重新分配列表大小調整:

var result = new List<object>(l1.Count + l2.Count + l3.Count + l4.Count + l5.Count); 
result.AddRange(l1); 
result.AddRange(l2); 
result.AddRange(l3); 
result.AddRange(l4); 
result.AddRange(l5);