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

时间:2011-10-17 15:04:31

标签: c# linq coding-style

我有ListMyType1个对象。我想在ListMyType2MyType2个对象中复制所有这些对象,其中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); } 个对象作为参数。

现在,我这样做:

{{1}}

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

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你应该可以这样做:

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

答案 4 :(得分:0)

如果您只是将list1中的所有元素复制到list2,您将获取这些元素的真实副本。你将只有另一个包含相同元素的列表!!!

答案 5 :(得分:0)

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不需要中间调整大小。

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

答案 6 :(得分:0)

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

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