[英]Convert Dictionary<MyType>.ValueCollection to 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.