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

时间:2009-12-15 18:06:14

标签: 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});
}

任何帮助都会受到赞赏 - 我是lambda和linq的新手 谢谢, 小号

13 个答案:

答案 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)

或者将constructorlinkSelect一起使用:

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