我想知道是否可以在不执行 foreach 循环的情况下使用 c# 将一个列表复制到另一个列表中,我找到了这个链接:
如何在没有 foreach 的情况下将项目从列表复制到列表?
Jon Skeet 在哪里发布了这个答案:
targetList.AddRange(sourceList);
在我访问此链接后,我遇到了一个新问题,即是否可以将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而无需执行 foreach 循环?
我想知道是否可以在不执行 foreach 循环的情况下使用 c# 将一个列表复制到另一个列表中,我找到了这个链接:
如何在没有 foreach 的情况下将项目从列表复制到列表?
Jon Skeet 在哪里发布了这个答案:
targetList.AddRange(sourceList);
在我访问此链接后,我遇到了一个新问题,即是否可以将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而无需执行 foreach 循环?
您可以执行以下操作:
targetlist.AddRange(sourceList.ConvertAll(x => new targetItem(){prop1 = x.prop1, prop2 = x.prop2}));
在场景下,循环仍在发生,但代码看起来更整洁!
你可以使用以下
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});
}
如果您想将某些特定条目从 ListA 复制到 ListB 中,您可以使用 LINQ 从 ListA 检索条目
`var entriesToCopy = from item in ListA
where item.Property == "SomeValue"
select item;`
关于您关于架构的陈述“两个列表的架构不同”。如果您在谈论 List 类型,它们实际上并没有“模式”,它们只是对象的集合,因此您需要根据 entryToCopy 的结果在 ListB 中转换、转换、创建相同类型的对象。
如果您在 ListA 的对象中指定了转换,则可以使用
.AddRange(entriesToCopy.Cast<ObjectTypeB>())
如果您知道列表的大小,则可以执行以下操作:
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
也许它不是最好的解决方案,但它满足您的要求。
在任何其他情况下,无论使用哪种方法,您都必须显式或隐式地遍历列表。但是,您可以使用一些并行化来使事情更加健壮。