我想知道是否可以使用c#将列表复制到另一个列表而不执行foreach循环,我找到了这个链接:
How do I copy items from list to list without foreach?
Jon Skeet发布了这件衣服:
targetList.AddRange(sourceList);
在我访问此链接之后,一个新的问题发生在我身上,这可能会将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而不执行foreach循环?
答案 0 :(得分:5)
您可以执行以下操作:
targetlist.AddRange(sourceList.ConvertAll(x => new targetItem(){prop1 = x.prop1, prop2 = x.prop2}));
在幕后,循环仍在发生,但代码看起来更整洁!
答案 1 :(得分:1)
您可以使用以下
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});
}
答案 2 :(得分:0)
如果您想将ListA中的某些特定条目复制到ListB,可以使用LINQ从ListA中检索条目
`var entriesToCopy = from item in ListA
where item.Property == "SomeValue"
select item;`
关于关于模式的声明“两个列表的模式不同”。如果你在谈论List类型,它们实际上没有“Schemas”它们只是一个对象集合,所以你需要从entriesToCopy的结果中转换,转换,在ListB中创建一个相同类型的对象。
如果您在ListA的对象中指定了转换,则可以使用
.AddRange(entriesToCopy.Cast<ObjectTypeB>())
答案 3 :(得分: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
也许它不是最好的解决方案,但它符合您的要求。
在任何其他情况下,无论使用何种方法,都必须通过列表显式或隐式迭代。但是,您可以使用一些并行化以使事情更加健壮。