2012-02-15 28 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); 
相关问题