使用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();