【发布时间】:2010-10-08 01:11:38
【问题描述】:
我有:
IEnumerable<Foo> foolist
我想将其转换为:
IEnumerable<Bar> barlist
是否有 linq / lambda 解决方案可以从一个移动到另一个
两个对象(foo 和 bar)都有我要转换的简单属性。例如:
bar.MyYear = foo.Year
它们每个都有大约 6 个属性
【问题讨论】:
标签: c# linq collections
我有:
IEnumerable<Foo> foolist
我想将其转换为:
IEnumerable<Bar> barlist
是否有 linq / lambda 解决方案可以从一个移动到另一个
两个对象(foo 和 bar)都有我要转换的简单属性。例如:
bar.MyYear = foo.Year
它们每个都有大约 6 个属性
【问题讨论】:
标签: c# linq collections
你可以这样做:
IEnumerable<Bar> barlist = foolist.Select(
foo => new Bar(foo.Year)); // Add other construction requirements here...
Enumerable.Select 确实是一个投影函数,因此非常适合类型转换。来自帮助:
将序列的每个元素投影到新的形式中。
编辑:
由于Bar 没有构造函数(来自您的 cmets),因此您可以改用对象初始化器:
IEnumerable<Bar> barlist = foolist.Select(
foo => new Bar()
{
Year = foo.Year,
Month = foo.Month
// Add all other properties needed here...
});
【讨论】:
就通用数据处理模式而言,通用 Map/Reduce 范式的映射是我们正在寻找的基本原则(如果您原谅双关语,它将映射到 LINQ 中的 Select,如 @ Reed Copsey 举了一个很好的例子)
AutoMapper 是一个库,它在应用 LINQ 的环境中实现这种基于约定的投影/映射,如果您有一组足够复杂的要求来保证引入另一个库的认知开销,则可能值得为您研究在你的背景下派对。
【讨论】:
如果 Foo 和 Bar 之间存在引用(或标识)转换,那么这是泛型中协变或逆变的示例。
C#4.0 支持泛型中的协变和逆变。
代码应该类似于:
IEnumerable
傻瓜 = 新列表 (); IEnumerable
barlist = 傻瓜;
如果您是
更多信息请见:
【讨论】: