如何将List的某些字段复制到另一个List的某些字段而不使用foreach循环?

时间:2013-10-08 08:48:57

标签: c# list

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

How do I copy items from list to list without foreach?

Jon Skeet发布了这件衣服:

targetList.AddRange(sourceList);

在我访问此链接之后,一个新的问题发生在我身上,这可能会将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而不执行foreach循环?

4 个答案:

答案 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

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

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