2009-02-09 68 views
6

我對使用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); 
} 
+0

我會更新你的評論給喬恩... – 2009-02-09 15:38:16

+0

請設置你的評論作爲這個thred的答案http://stackoverflow.com/questions/1947919/template-style-is-not-setting-有些偏好,我將其標記爲已接受。 – FFire 2009-12-27 14:56:32

回答

4

當您調用第一個重載時,它會立即調用第二個重載。這將不會執行其正文中的任何代碼,該代碼已被移入實現迭代器塊的嵌套類中。當GetEnumerator()然後MoveNext()首先在返回的IEnumerable<TTo>,然後上調用時,第二個重載中的代碼將開始執行。

我有一個相當長的article on the iterator block implementation,你可能會覺得有趣。

+0

你同意@Marc Gravell嗎?我使用這種方法的方式是將EF對象轉換爲WCF的DataContract對象。所以List(Hotels).ConvertTo(SerializableHotels,Hotels)(); – bendewey 2009-02-09 15:07:23

2

是的,因爲產量回報只是產生在編譯一個IEnumerator類。 yield return只是編譯器的魔力。

2

另外......大多數類型轉換器僅適用於字符串/字符串。這裏另一個有趣的選項可能是根據類型定義的靜態轉換運算符 - 我有一些.NET 3.5代碼在MiscUtil中執行此操作 - 請參閱Convert方法here

回覆您的評論:

我使用這個方法的辦法是 的EF對象轉化爲WCF一個 DataContract對象。所以 列表(酒店).ConvertTo(SerializableHotels, 酒店)()

這聽起來像你應該要麼是使用序列,或者如果屬性名稱有直接的關係,可能像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