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

发布于 2024-12-10 15:13:43 字数 533 浏览 0 评论 0原文

我有一个 MyType1 对象的 List 。我想将所有这些对象复制到 MyType2 对象的新 List 中,并具有一个采用 MyType1MyType2 的构造函数code> 对象作为参数。

现在,我这样做:

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 是可能的)?

I have a List of MyType1 objects. I want to copy all these objects in a new List of MyType2 objects, having a constructor for MyType2 that takes a MyType1 object as argument.

For now, I do it this way:

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);
}

Is there a way to do this one-line (I'm thinking maybe it is possible with Linq)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

分開簡單 2024-12-17 15:13:43
var type2objects = type1objects.Select(o => new MyType2(o)).ToList();
var type2objects = type1objects.Select(o => new MyType2(o)).ToList();
岁月流歌 2024-12-17 15:13:43

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

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

You can use a simple projection using Select() with Linq, then make a list out of this enumeration using ToList():

var type2objects = type1objects.Select( x => new MyType2(x))
                               .ToList();
绝對不後悔。 2024-12-17 15:13:43
var type2objects = type1objects.Select(type1obj => new MyType2(type1obj)).ToList();
var type2objects = type1objects.Select(type1obj => new MyType2(type1obj)).ToList();
合约呢 2024-12-17 15:13:43

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

If you just copy all elements from list1 to list2 you will not get true copies of those elements. You will just have another list with the same elements!!!

吲‖鸣 2024-12-17 15:13:43

您还可以从 Convert.ChangeType() 中获得一些好处,具体取决于您要转换的内容:

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

You might also get some mileage out of Convert.ChangeType() depending on what you're converting:

List<MyType2> type2objects = type1objects.Select(
    type1object => Convert.ChangeType(type1object, typeof(MyType2))
    ).ToList();
柏拉图鍀咏恒 2024-12-17 15:13:43
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不需要中间调整大小。

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

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

In this way you can even preserve the values contained in type2objects.

I'll add that you know the size of type1objects, so you can speedup a little:

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

Here the capacity of type2objects is pre-setted.

or, if you are re-using an "old2" type2objects

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

In this way you know the List won't need intermediate resizes.

Someone will call this premature optimization, and it is. But you could need it.

你又不是我 2024-12-17 15:13:43

你应该能够做这样的事情:

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

You should be able to do something like this:

List<MyType2> list2 = new List<MyType2>(list1.Select(x => new MyType2(x)));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文