使用 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});
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
尝试以下方法
这是使用 Lambda 和 LINQ 的组合来实现解决方案。 Select 函数是一种投影样式方法,它将把传入的委托(或本例中的 lambda)应用于原始集合中的每个值。结果将在新的
IEnumerable
中返回。 .ToList 调用是一种扩展方法,它将将此IEnumerable
转换为List
。Try the following
This is using a combination of Lambdas and LINQ to achieve the solution. The Select function is a projection style method which will apply the passed in delegate (or lambda in this case) to every value in the original collection. The result will be returned in a new
IEnumerable<TargetType>
. The .ToList call is an extension method which will convert thisIEnumerable<TargetType>
into aList<TargetType>
.如果您知道想要从
List
转换为List
,那么List.ConvertAll
将比Select
/ToList
因为它知道开始时的确切大小:在更一般的情况下,当您只知道源为
IEnumerable
时,使用选择
/ToList
是正确的选择。您可能还认为,在使用 LINQ 的世界中,从这里开始更为惯用……但至少值得了解ConvertAll
选项。If you know you want to convert from
List<T1>
toList<T2>
thenList<T>.ConvertAll
will be slightly more efficient thanSelect
/ToList
because it knows the exact size to start with:In the more general case when you only know about the source as an
IEnumerable<T>
, usingSelect
/ToList
is the way to go. You could also argue that in a world with LINQ, it's more idiomatic to start with... but it's worth at least being aware of theConvertAll
option.我相信这样的事情应该有效:
I believe something like this should work:
这是一个简单的例子..
Here's a simple example..
假设您有多个要转换的属性。
Assume that you have multiple properties you want to convert.
或者使用
构造函数
&linq
与Select
:Linq
线条更加柔和! ;-)Or with a
constructor
&linq
withSelect
:The
Linq
line is more soft! ;-)如果需要使用函数来强制转换:
我的自定义函数在哪里:
If you need to use a function to cast:
Where my custom function is:
对于类似类型的类。
列表<目标列表> targetlst= JsonConvert.DeserializeObject
>(JsonConvert.SerializeObject(
));
for similar type class.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
如果类型可以直接转换,这是最干净的方法:
如果类型不能直接转换,那么您可以将属性从原始类型映射到目标类型。
If the types can be directly cast this is the cleanest way to do it:
If the types can't be directly cast then you can map the properties from the orginal type to the target type.
如果从一个列表映射到另一个列表时需要进行转换,您可以从 Convertall 调用一个函数来测试转换。
If casting when mapping from one list to another is required, from convertall, you can call a function to test the casting.
我们首先考虑List类型是String,并且想将其转换为List的Integer类型。
在原始列表中添加值。
使用 forEach创建整数类型
打印列表值的目标列表:
We will consider first List type is String and want to convert it to Integer type of List.
Add values in the original List.
Create target List of Integer Type
Print List values using forEach: