我如何从一个集合转换为另一个集合

时间:2010-10-08 01:11:39

标签: c# linq collections

我有:

 IEnumerable<Foo> foolist

我希望将其转换为:

IEnumerable<Bar> barlist

是否有linq / lambda解决方案从一个移动到另一个

两个对象(foo和bar)都具有我要转换的简单属性。例如:

 bar.MyYear = foo.Year

他们每人都有大约6个属性

3 个答案:

答案 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然后里德的答案就是你的宝贝。

有关详细信息,请访问:

http://msdn.microsoft.com/library/dd799517(VS.100).aspx