我有一个foreach循环,读取一种类型的对象列表,并产生另一种类型的对象列表。有人告诉我,lambda表达式可以实现相同的结果。

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

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}

当前回答

var target = origList.ConvertAll(x => (TargetType)x);

其他回答

对于类似类型的类。

<targetlist> targetlst= jsoninvert . deserializeinct <targetlist> (JsonConvert.SerializeObject . <List<baselist>);

List<target> targetList = new List<target>(originalList.Cast<target>());

如果类型可以直接转换,这是最干净的方法:

var target = yourList.ConvertAll(x => (TargetType)x);

如果不能直接转换类型,则可以将属性从原始类型映射到目标类型。

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

试试下面的方法

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

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

或者使用构造函数& linq选择:

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

Linq线条更柔和!: -)