代码之家  ›  专栏  ›  技术社区  ›  bendewey

超额使用收益率

  •  6
  • bendewey  · 技术社区  · 17 年前

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

    我的问题是,第一种重载方法是否具有与第二种方法相同的收益率效应?

    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);
    }
    
    3 回复  |  直到 17 年前
        1
  •  4
  •   Jon Skeet    17 年前

    当您调用第一个重载时,它将立即调用第二个重载。它不会执行其主体中的任何代码,这些代码将被移动到实现迭代器块的嵌套类中。什么时候 GetEnumerator() 然后 MoveNext() IEnumerable<TTo> , 然后 第二个重载中的代码将开始执行。

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

        2
  •  2
  •   Nick Berardi    17 年前

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

        3
  •  2
  •   Marc Gravell    17 年前

    作为旁白。。。大多数类型转换器只在字符串之间工作。这里另一个有趣的选项可能是针对类型定义的静态转换运算符-我有一些.NET3.5代码在 MiscUtil -见 Convert 提到的方法 here .

    请回复您的评论:

    我使用这种方法的方式是 将EF对象转换为 列表(酒店).ConvertTo(可序列化酒店),

    听起来你应该 使用序列化,或者如果属性名称有直接关系,可能类似 PropertyCopy<To>.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<,> TypeConverter .

    推荐文章