使用lambda表达式将对象列表从一种类型转换为另一种类型

Str*_*ton 202 c# generics lambda

我有一个foreach循环读取一种类型的对象列表并生成一个不同类型的对象列表.我被告知lambda表达式可以达到相同的效果.

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激 - 我是lambda和linq的新手谢谢,s

Jar*_*Par 293

请尝试以下方法

var targetList = origList
  .Select(x => new TargetType() { SomeValue = x.SomeValue })
  .ToList();
Run Code Online (Sandbox Code Playgroud)

这是使用Lambdas和LINQ的组合来实现解决方案.Select函数是一种投影样式方法,它将传入的委托(在本例中为lambda)应用于原始集合中的每个值.结果将以新的方式返回IEnumerable<TargetType>..ToList调用是一种扩展方法,将其转换IEnumerable<TargetType>List<TargetType>.


Jon*_*eet 211

如果你知道你想要转换List<T1>List<T2>那么List<T>.ConvertAll将比Select/ 更有效,ToList因为它知道开始的确切大小:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
Run Code Online (Sandbox Code Playgroud)

在更一般的情况下,当你只知道源是一个时IEnumerable<T>,使用Select/ ToList是要走的路.你可能还认为,与LINQ的世界,这是更地道下手......但它是值得至少是知道的ConvertAll选项.

  • 你为什么需要一个地方?如果你只有`IEnumerable <T>`那么就按照Jared的答案调用`Select`和`ToList`. (2认同)

小智 50

var target = origList.ConvertAll(x => (TargetType)x);
Run Code Online (Sandbox Code Playgroud)

  • 这是什么语法?这与 lambda 不相似。一些文档链接将不胜感激。不过谢谢,它在这里工作正常 (2认同)

小智 29

List<target> targetList = new List<target>(originalList.Cast<target>());
Run Code Online (Sandbox Code Playgroud)

  • -1这只有在可以进行转换的情况下才有效,而在OPs的情况下确实如此. (5认同)

And*_*ite 14

我相信这样的事情应该有效:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
Run Code Online (Sandbox Code Playgroud)

  • 你需要在最后添加一个 `.ToList()`,否则这只会提供一个 IEnumerable。 (3认同)

Ian*_*n P 9

这是一个简单的例子..

List<char> c = new List<char>() { 'A', 'B', 'C' };

List<string> s = c.Select(x => x.ToString()).ToList();
Run Code Online (Sandbox Code Playgroud)


Chr*_*old 7

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
Run Code Online (Sandbox Code Playgroud)