繁体   English   中英

将对象列表复制到一行代码中的另一个类型列表中

[英]Copy a list of objects to another typed list in one line of code

我有一个MyType1对象List 我想在新的MyType2对象List中复制所有这些对象,具有MyType2的构造函数,该构造函数将MyType1对象作为参数。

现在,我这样做:

List<MyType1> type1objects = new List<MyType1>();
// Fill type1objects
// ...
List<MyType2> type2objects = new List<MyType2>();
foreach (MyType1 type1obj in type1objects) {
    MyType2 type2obj = new MyType2(type1obj);
    type2objects.Add(type2obj);
}

有没有办法做到这一行(我想也许Linq可能)?

var type2objects = type1objects.Select(o => new MyType2(o)).ToList();

您可以使用带Linq的Select()进行简单投影,然后使用ToList()从此枚举中创建一个列表:

var type2objects = type1objects.Select( x => new MyType2(x))
                               .ToList();
var type2objects = type1objects.Select(type1obj => new MyType2(type1obj)).ToList();

你应该可以做这样的事情:

List<MyType2> list2 = new List<MyType2>(list1.Select(x => new MyType2(x)));

如果您只是将list1中的所有元素复制到list2,那么您将无法获得这些元素的真实副本。 你将只有另一个具有相同元素的列表!

List<MyType2> type2objects = new List<MyType2>();
type2objects.AddRange(type1objects.Select(p => new MyType2(p)));

通过这种方式,您甚至可以保留type2objects包含的值。

我要补充一点,你知道type1objects的大小,所以你可以加速一点:

List<MyType2> type2objects = new List<MyType2>(type1objects.Count);

这里预先设置了type2objects的容量。

或者,如果您正在重新使用“old2” type2objects

if (type2objects.Capacity < type1objects.Count + type2objects.Count)
{
    type2objects.Capacity = type1objects.Count + type2objects.Count;
}

通过这种方式,您知道List不需要中间调整大小。

有人会称之为过早优化,而且确实如此。 但你可能需要它。

您可能还会从Convert.ChangeType()获得一些里程,具体取决于您要转换的内容:

List<MyType2> type2objects = type1objects.Select(
    type1object => Convert.ChangeType(type1object, typeof(MyType2))
    ).ToList();

暂无
暂无

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

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