有没有一种简单的方法可以将一个IList <mytype>附加到另一个?</mytype>

时间:2012-03-01 16:42:23

标签: c# .net c#-4.0 .net-4.0

以下是一些示例代码:

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

如何将一个列表的内容添加到另一个列表中?是否有方法?

5 个答案:

答案 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的元素数: 并得出了这样的结果(收集的长度不同)

results for calculation

答案 3 :(得分:0)

如果第二个列表的运行时类型为List<T>,则可以转换为该类型并使用AddRange()方法。

否则,你必须自己做一个循环。或者,您可以使用linq创建一个包含两个源列表内容的新列表。

答案 4 :(得分:0)

我使用了这一行方法:

Array.ForEach(ilist1.ToArray(), x => ilist2.Add(x));