我有一个foreach循环读取一种类型的对象列表并生成一个不同类型的对象列表。我被告知lambda表达式可以达到相同的效果。
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
任何帮助都会受到赞赏 - 我是lambda和linq的新手 谢谢, 小号
答案 0 :(得分:273)
尝试以下
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
这是使用Lambdas和LINQ的组合来实现解决方案。 Select函数是一种投影样式方法,它将传入的委托(在本例中为lambda)应用于原始集合中的每个值。结果将以新的IEnumerable<TargetType>
返回。 .ToList调用是一种扩展方法,可将此IEnumerable<TargetType>
转换为List<TargetType>
。
答案 1 :(得分:198)
如果您知道,您想要从List<T1>
转换为List<T2>
,那么List<T>.ConvertAll
将比Select
/ {{1}更有效率因为它知道开头的确切大小:
ToList
在更一般的情况下,当您仅将来源知道为target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
时,使用IEnumerable<T>
/ Select
是可行的方法。你可以也认为在一个拥有LINQ的世界中,它开始时更加惯用......但至少值得了解ToList
选项。
答案 2 :(得分:47)
var target = origList.ConvertAll(x => (TargetType)x);
答案 3 :(得分:28)
List<target> targetList = new List<target>(originalList.Cast<target>());
答案 4 :(得分:12)
我相信这样的事情应该有效:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
答案 5 :(得分:8)
这是一个简单的例子..
List<char> c = new List<char>() { 'A', 'B', 'C' };
List<string> s = c.Select(x => x.ToString()).ToList();
答案 6 :(得分:7)
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
答案 7 :(得分:2)
假设您有多个要转换的属性。
public class OrigType{
public string Prop1A {get;set;}
public string Prop1B {get;set;}
}
public class TargetType{
public string Prop2A {get;set;}
public string Prop2B {get;set;}
}
var list1 = new List<OrigType>();
var list2 = new List<TargetType>();
list1.ConvertAll(x => new OrigType { Prop2A = x.Prop1A, Prop2B = x.Prop1B })
答案 8 :(得分:0)
如果您需要使用函数进行强制转换:
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list2 = list1.ConvertAll(x => myConvertFuntion(x));
我的自定义函数是:
private Type2 myConvertFunction(Type1 obj){
//do something to cast Type1 into Type2
return new Type2();
}
答案 9 :(得分:0)
用于类似类型的类。
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
答案 10 :(得分:0)
或者将constructor
和link
与Select
一起使用:
public class TargetType {
public string Prop1 {get;set;}
public string Prop1 {get;set;}
// Constructor
public TargetType(OrigType origType) {
Prop1 = origType.Prop1;
Prop2 = origType.Prop2;
}
}
var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();
Link
行更加柔和! ;-)
答案 11 :(得分:-1)
如果可以直接转换类型,这是最干净的方法:
var target = yourList.ConvertAll(x => (TargetType)x);
如果不能直接转换类型,则可以将属性从原始类型映射到目标类型。
var target = yourList.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
答案 12 :(得分:-2)
我们将考虑首先将List类型为String并将其转换为List的Integer类型。
List<String> origList = new ArrayList<>(); // assume populated
在原始列表中添加值。
origList.add("1");
origList.add("2");
origList.add("3");
origList.add("4");
origList.add("8");
创建整数类型的目标列表
List<Integer> targetLambdaList = new ArrayList<Integer>();
targetLambdaList=origList.stream().map(Integer::valueOf).collect(Collectors.toList());
使用forEach打印列表值:
targetLambdaList.forEach(System.out::println);