IEnumerable<Foo> foolist
我希望将其转换为:
IEnumerable<Bar> barlist
是否有linq / lambda解决方案从一个移动到另一个
两个对象(foo和bar)都具有我要转换的简单属性。例如:
bar.MyYear = foo.Year
他们每人都有大约6个属性
答案 0 :(得分:8)
你可以这样做:
IEnumerable<Bar> barlist = foolist.Select(
foo => new Bar(foo.Year)); // Add other construction requirements here...
Enumerable.Select实际上是一个投影函数,因此非常适合类型转换。来自帮助:
将序列的每个元素投影到新表单中。
编辑:
由于Bar
没有构造函数(来自您的注释),因此您可以使用对象初始值设定项:
IEnumerable<Bar> barlist = foolist.Select(
foo => new Bar()
{
Year = foo.Year,
Month = foo.Month
// Add all other properties needed here...
});
答案 1 :(得分:1)
就一般数据处理模式而言,一般Map / Reduce范例的地图是我们正在寻找的基本原则(如果您将原谅双关语,则映射到LINQ中的Select
,正如@Reed Copsey给出了一个很好的例子)
AutoMapper是一个库,它在LINQ适用的环境中实现这种基于约定的投影/映射,如果你有足够复杂的要求来保证引入带来另一个的认知开销,可能值得为你调查。图书馆在你的背景下参加聚会。
答案 2 :(得分:1)
如果在Foo和Bar之间存在引用(或身份)转换,则这是泛型中的协方差或逆变的示例。
C#4.0支持泛型中的协方差和逆变。
代码应该类似于:
的IEnumerable&LT;富&GT; foolist = new List&lt; Foo&gt;();
的IEnumerable&LT;酒吧及GT; barlist = foolist;
如果你是&lt; C#4.0然后里德的答案就是你的宝贝。
有关详细信息,请访问: