【问题标题】:How do i convert from one collection to another如何从一个集合转换为另一个集合
【发布时间】:2010-10-08 01:11:38
【问题描述】:

我有:

 IEnumerable<Foo> foolist

我想将其转换为:

IEnumerable<Bar> barlist

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

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

 bar.MyYear = foo.Year

它们每个都有大约 6 个属性

【问题讨论】:

    标签: c# linq collections


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

    • @Reed Copsey - 我不明白你为什么将 foo.Year 传递给 Bar()。 bar 没有构造函数,而是一堆属性
    • @ooo:我编辑了我的答案,向您展示如何在没有构造函数的情况下完成这项工作。
    • 很好奇 - 为什么要对任何人投反对票 - 这似乎是一个完全合理的答案......?
    • @ChaosPandion:啊,好吧——那是当之无愧的-1!谢谢你的解释。 ;)
    【解决方案2】:

    就通用数据处理模式而言,通用 Map/Reduce 范式的映射是我们正在寻找的基本原则(如果您原谅双关语,它将映射到 LINQ 中的 Select,如 @ Reed Copsey 举了一个很好的例子)

    AutoMapper 是一个库,它在应用 LINQ 的环境中实现这种基于约定的投影/映射,如果您有一组足够复杂的要求来保证引入另一个库的认知开销,则可能值得为您研究在你的背景下派对。

    【讨论】:

    • 除了这里没有reduce - 它是纯粹的“地图”。
    • @Reed Copsey:是的,v1 需要做很多工作。我在拼凑“投影”,但你现在已经有了,所以我不会刻意!
    • @Reed Copsey:你觉得现在更有意义了吗?那里的一些胆小的天才似乎没有并且想要使其成为-1。我很想看到他们精彩的反击观点在这里成为一篇精彩的文章:D
    • 我确实想知道为什么有时我会在这个幼稚的网站上浪费时间。
    • 呵呵呵呵,好吧,我投票给你是为了抵消-1,尤其是现在它已经改写了。 ;)
    【解决方案3】:

    如果 Foo 和 Bar 之间存在引用(或标识)转换,那么这是泛型中协变或逆变的示例。

    C#4.0 支持泛型中的协变和逆变。

    代码应该类似于:

    IEnumerable 傻瓜 = 新列表();

    IEnumerable barlist = 傻瓜;

    如果您是

    更多信息请见:

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

    【讨论】:

    • +1 好点。不过,从投票模式(以及对已接受答案的评论)来看,共识似乎是他只是想复制这些字段
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2020-05-25
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2020-01-09
    相关资源
    最近更新 更多