2

我想知道是否可以在不执行 foreach 循环的情况下使用 c# 将一个列表复制到另一个列表中,我找到了这个链接:

如何在没有 foreach 的情况下将项目从列表复制到列表?

Jon Skeet 在哪里发布了这个答案:

targetList.AddRange(sourceList);

在我访问此链接后,我遇到了一个新问题,即是否可以将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而无需执行 foreach 循环?

4

4 回答 4

5

您可以执行以下操作:

targetlist.AddRange(sourceList.ConvertAll(x => new targetItem(){prop1 = x.prop1, prop2 = x.prop2}));

在场景下,循环仍在发生,但代码看起来更整洁!

于 2013-10-08T08:54:24.600 回答
2

你可以使用以下

Struct Foo
{
public string Bar1;
public string Bar2
}

void SomeMethod()
{
List<Input> input = new List<Input>();
List<Foo> output = new List<Foo>();

output = input.Select(a => new Foo(){Bar1 = a.bar1, Bar2 = a.bar2});
}
于 2013-10-08T08:56:58.503 回答
0

如果您想将某些特定条目从 ListA 复制到 ListB 中,您可以使用 LINQ 从 ListA 检索条目

`var entriesToCopy = from item in ListA
                    where item.Property == "SomeValue"
                    select item;`

关于您关于架构的陈述“两个列表的架构不同”。如果您在谈论 List 类型,它们实际上并没有“模式”,它们只是对象的集合,因此您需要根据 entryToCopy 的结果在 ListB 中转换、转换、创建相同类型的对象。

如果您在 ListA 的对象中指定了转换,则可以使用

.AddRange(entriesToCopy.Cast<ObjectTypeB>())

于 2013-10-08T08:55:19.383 回答
0

如果您知道列表的大小,则可以执行以下操作:

var list1 = new List<int> {1, 2, 3}
var list2 = new List<int> {0, 0, 0, 1, 1, 1} // <-- Notice different "schema"

list2[3] = list1[0]; // <--
list2[4] = list1[1]; // <--
list2[5] = list1[2]; // <-- Notice no loops

也许它不是最好的解决方案,但它满足您的要求。

在任何其他情况下,无论使用哪种方法,您都必须显式或隐式地遍历列表。但是,您可以使用一些并行化来使事情更加健壮。

于 2013-10-08T08:57:18.897 回答