将5 List <object>组合成一个List <object> </object> </object>

时间:2012-02-15 18:01:12

标签: c# list

我有5个列表,其中包含相同的对象。我只是想将它们全部与完整的属性组合成一个更大的列表。

我想到了一种方法,但我认为有更好的方法。

List<object> blah = new List<object>

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

如果您知道更好的方法,请告诉我,提前致谢!

8 个答案:

答案 0 :(得分:5)

您可以使用List<T>.AddRange()或Linq:

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

答案 1 :(得分:4)

使用Enumerable.Concat()

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

答案 2 :(得分: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();

或者,如果您关心的是性能而不是可读性,请执行此操作以避免在列表调整大小上重新分配内存:

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);

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您的问题代码:

List<object> blah = new List<object> 

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

...如果您使用AddRange

,可能会更简洁
List<object> blah = new List<object> 
blah.AddRange(ObjectList1); 

因此,您可以调用AddRange 5次或连接5个列表并将结果传递给AddRange。

目前尚不清楚“所有属性是否完整”究竟是什么意思,但如果这意味着您的其他列表是不同更多特定类型的列表而不是object ,然后不,你不能创建一个列表,它将为你提供对列表成员的强类型访问。

修改

似乎“所有属性都保持不变”意味着新列表中的对象将具有与旧列表中的对象相同的属性值。当然,他们会,因为它们是相同的对象!列表实际上并不包含对象,毕竟它们包含对象的引用(因为{{ 1}}是引用类型)。新列表包含引用的副本,而不是对象的副本。

答案 5 :(得分:1)

尝试

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

答案 6 :(得分:1)

我不知道你在这里要做什么。也许您应该将对象强制转换为特定对象。代码对我来说是正确的,但这有点奇怪。

答案 7 :(得分:1)

为了便于阅读,我建议......

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