以下是一些示例代码:
IList<MyType> myList1=new List<MyType>();
IList<MyType> myList2=new List<MyType>();
// Populate myList1
...
// Add contents of myList1 to myList2
myList2.Add(myList1); // Does not compile
如何将一个列表的内容添加到另一个列表中?是否有方法?
答案 0 :(得分:24)
没有很好的内置方法可以做到这一点。你真正想要的是一个AddRange
方法,但它不存在于IList<T>
(或它的层次结构)上。尽管如此,为此定义一个新的扩展方法是直截了当的
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) {
foreach (var cur in enumerable) {
collection.Add(cur);
}
}
myList2.AddRange(myList1);
答案 1 :(得分:11)
如果您将两个列表类型都声明为具体List
而不是IList
,则可以使用AddRange
方法:
List<MyType> myList1=new List<MyType>();
List<MyType> myList2=new List<MyType>();
myList2.AddRange(myList1);
否则你可以使用LINQ来结合两者:
using System.Linq;
IList<MyType> myList1=new List<MyType>();
IList<MyType> myList2=new List<MyType>();
var newList = myList1.Concat(myList2);
答案 2 :(得分:11)
使用Enumerablr扩展,
myList2=new List<MyType>(myList2.Concat(myList1))
顺便说一句,如果你没有填充myList2,你可以根据myLis1创建它。
修改强>
我试图研究几种情况的性能
1) AddRange通过添加
List2.AddRange(List1);
public static class AddRangeUtils
{
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable)
{
foreach (var cur in enumerable)
{
collection.Add(cur);
}
}
}
2)Concat
List2 = new List<TestClass>(List2.Concat(List1))
3)预定义收集计数1
var thirdList = new List<TestClass>(List2.Count + List1.Count);
foreach (var testClass in List1)
{
thirdList.Add(testClass);
}
foreach (var testClass in List2)
{
thirdList.Add(testClass);
}
List2 = thirdList;
4)预定义收集计数2
var thirdList = new List<TestClass>(List2.Count + List1.Count);
thirdList.AddRange(List1);
thirdList.AddRange(List2);
List2 = thirdList;
Collection的Count是每个列表List1和List2的元素数: 并得出了这样的结果(收集的长度不同)
答案 3 :(得分:0)
如果第二个列表的运行时类型为List<T>
,则可以转换为该类型并使用AddRange()
方法。
否则,你必须自己做一个循环。或者,您可以使用linq创建一个包含两个源列表内容的新列表。
答案 4 :(得分:0)
Array.ForEach(ilist1.ToArray(), x => ilist2.Add(x));