使用lambdaexpression式将对象列表从一种types转换为另一种types

我有一个foreach循环读取一个types的对象列表,并产生一个不同types的对象列表。 我被告知lambdaexpression式可以达到相同的结果。

var origList = List<OrigType>(); // assume populated var targetList = List<TargetType>(); foreach(OrigType a in origList) { targetList.Add(new TargetType() {SomeValue = a.SomeValue}); } 

任何帮助将不胜感激,我是新lambda和linq谢谢,S

尝试以下

 var targetList = origList .Select(x => new TargetType() { SomeValue = x.SomeValue }) .ToList(); 

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

如果您知道要从List<T1>转换为List<T2>那么List<T>.ConvertAll将比Select / ToList效率稍高,因为它知道开始的确切大小:

 target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue }); 

在更一般的情况下,当您只将源代码作为IEnumerable<T>来使用时,使用Select / ToList即可。 你可以争辩说,在一个LINQ的世界里,开始的时候更习惯于……但至less值得注意的是ConvertAll选项。

 var target = origList.ConvertAll(x => (TargetType)x); 
 List<target> targetList = new List<target>(originalList.Cast<target>()); 
 var list1 = new List<Type1>(); var list2 = new List<Type2>(); list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 })); 

我相信这样的事情应该工作:

 origList.Select(a => new TargetType() { SomeValue = a.SomeValue}); 

这是一个简单的例子..

 List<char> c = new List<char>() { 'A', 'B', 'C' }; List<string> s = c.Select(x => x.ToString()).ToList();