繁体   English   中英

有没有简单的方法来追加一个IList <MyType> 到另一个?

[英]Is there an easy way to append one IList<MyType> to another?

这是一些示例代码:

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

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

没有出色的内置方法可以做到这一点。 您真正想要的是一个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);

如果您将两种列表类型都声明为具体的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);

使用Enumerablr扩展,

myList2=new List<MyType>(myList2.Concat(myList1))

顺便说一句,如果不填充myList2,则可以基于myLis1创建它。

编辑

我尝试研究几种情况的性能

1) 通过添加添加范围

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)康卡特

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;

集合的计数是每个列表List1和List2的元素计数:得出这样的结果(具有不同的集合长度)

计算结果

我使用了一种方法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM