【问题标题】:Overloaded use of yield return过度使用收益回报
【发布时间】:2009-02-09 14:36:59
【问题描述】:

我没有太多使用 yield 关键字的经验。我有这些用于类型转换的 IEnumerable 扩展。

我的问题是第一个重载方法是否具有与第二个方法相同的收益返回效果?

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList)
{
    return ConvertFrom<TTo, TFrom>(toList, TypeDescriptor.GetConverter(typeof(TTo)));
}

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList, TypeConverter converter)
{
    foreach (var t in toList)
        yield return (TTo)converter.ConvertFrom(t);
}

【问题讨论】:

标签: c# yield


【解决方案1】:

当你调用第一个重载时,它会立即调用第二个重载。这不会执行其主体中的任何代码,这些代码将被移动到实现迭代器块的嵌套类中。当GetEnumerator()MoveNext() 在返回的IEnumerable&lt;TTo&gt; 上首先被调用时,然后第二个重载中的代码将开始执行。

我有一个相当长的article on the iterator block implementation,你可能会觉得很有趣。

【讨论】:

  • 你同意@Marc Gravell 的观点吗?我使用此方法的方式是将 EF 对象转换为 WCF 的 DataContract 对象。所以 List(Hotels).ConvertTo(SerializableHotels, Hotels)();
  • 我对类型转换器没有坚定的看法 - 但我知道 Marc 比我更了解它。
  • 实际上,Jon - 这听起来像是您在 MiscUtil 中的属性映射器的工作(不记得名字了)。
【解决方案2】:

是的,因为 yield return 只是在编译时生成一个 IEnumerator 类。 yield return 只是编译器的魔法。

【讨论】:

    【解决方案3】:

    顺便说一句...大多数类型转换器仅适用于字符串。这里另一个有趣的选项可能是针对类型定义的静态转换运算符 - 我有一些 .NET 3.5 代码在 MiscUtil 中执行此操作 - 请参阅 Convert 提到的 here 方法。

    你的评论:

    我使用这种方法的方式是 将 EF 对象转换为 WCF 的 DataContract 对象。所以 List(Hotels).ConvertTo(SerializableHotels, 酒店)()

    听起来你应该要么使用序列化,或者如果属性名称有直接关系,也许像PropertyCopy&lt;To&gt;.CopyFrom(from) - 这又来自MiscUtil(但这次Jon的一些工作) - 即

    public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(
        this IEnumerable<TFrom> list, TypeConverter converter)
    {
        return list.Select(item => PropertyCopy<TTo>.CopyFrom<TFrom>(item);
    }
    

    除此之外,您可能最好谈论Conversion&lt;,&gt; 而不是TypeConverter

    【讨论】:

    • 马克,这太棒了。由于某些许可问题,我不确定是否可以使用它。我得检查一下,谢谢
    • 我想给你答案,因为你回答了我隐藏的未提出的问题,我谢谢你。虽然,其他人回答了我问的关于产量使用的确切问题。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2011-05-27
    • 2011-08-08
    • 2010-09-29
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多