使用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的新手 谢谢, s < / p >
318112 次浏览

试试下面的方法

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

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

我相信这样做是可行的:

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

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

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

在更一般的情况下,当你只知道源是IEnumerable<T>时,使用Select/ToList是正确的方法。你可以还认为在LINQ的世界里,更习惯的开始是…但它至少值得注意ConvertAll选项。

var list1 = new List<Type1>();
var list2 = new List<Type2>();


list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));

这里有一个简单的例子。

List<char> c = new List<char>() { 'A', 'B', 'C' };


List<string> s = c.Select(x => x.ToString()).ToList();
List<target> targetList = new List<target>(originalList.Cast<target>());
var target = origList.ConvertAll(x => (TargetType)x);

如果需要使用函数进行类型转换:

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

假设您有多个要转换的属性。

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

对于类似类型的类。

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

或者使用constructor &linqSelect:

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行更软!;-)

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

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

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

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

我们将考虑第一个列表类型是字符串,并希望将其转换为整数类型的列表。

List<String> origList = new ArrayList<>(); // assume populated

在原始列表中添加值。

origList.add("1");
origList.add("2");
origList.add("3");
origList.add("4");
origList.add("8");

创建Integer类型的目标列表

List<Integer> targetLambdaList = new ArrayList<Integer>();
targetLambdaList=origList.stream().map(Integer::valueOf).collect(Collectors.toList());

使用forEach打印列表值:

    targetLambdaList.forEach(System.out::println);

如果需要在从一个列表映射到另一个列表时进行强制转换,则可以从convertall调用一个函数来测试强制转换。

public int StringToInt(String value)
{
try
{
return Int32.Parse(value);
}
catch (Exception ex)
{
return -1;
}
}
[Fact]
public async Task TestConvertAll()
{
List<String> lstString = new List<String>{"1","2","3","4","5","6","7","8","9","10" };


List<int> lstInt = lstString.ConvertAll(new Converter<String, int>(StringToInt));
foreach (var item in lstInt)
{
output.WriteLine("{0}", item);
}
if (lstInt.Count()>0) {
Assert.True(true);
}
}