Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超额使用收益率_C#_Yield - Fatal编程技术网

C# 超额使用收益率

C# 超额使用收益率,c#,yield,C#,Yield,我没有太多使用yield关键字的经验。我有这些IEnumerable扩展用于类型转换 我的问题是,第一种重载方法是否具有与第二种方法相同的收益率效应 public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList) { return ConvertFrom<TTo, TFrom>(toList, TypeDescriptor.GetC

我没有太多使用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);
}
公共静态IEnumerable ConvertFrom(此IEnumerable toList)
{
返回ConvertFrom(toList,TypeDescriptor.GetConverter(typeof(TTo));
}
公共静态IEnumerable ConvertFrom(此IEnumerable toList,类型转换器)
{
foreach(toList中的变量t)
收益率-收益率(TTo)转换器;
}

是的,因为产生返回只是在编译时生成一个IEnumerator类<代码>产生返回只是编译器的魔法。

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


我有一本相当长的书,你可能会觉得有趣。

作为旁白。。。大多数类型转换器只在字符串之间工作。这里另一个有趣的选项可能是针对类型定义的静态转换运算符-我有一些.NET 3.5代码可以在中执行此操作-请参阅前面提到的
Convert
方法

请回复您的评论:

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

听起来您应该使用序列化,或者如果属性名称有直接关系,可能类似于
PropertyCopy.CopyFrom(from)
——这也是来自MiscUtil(但这次是Jon的一些工作)——即

公共静态IEnumerable ConvertFrom(
此IEnumerable列表(类型转换器)
{
返回列表。选择(项=>PropertyCopy.CopyFrom(项);
}

除此之外,您可能最好谈论
转换
而不是
类型转换器

您同意@Marc gravel吗?我使用此方法的方式是将EF对象转换为WCF的DataContract对象。因此,列出(Hotels)。转换为(SerializableHotels,Hotels)();我对类型转换器没有明确的看法,但我知道Marc对它的了解比我多。事实上,Jon,这听起来像是MiscUtil中属性映射器的工作(不记得名称)。我会将您的评论更新给Jon…请在本帖中设置您的评论作为答案,我将其标记为接受。Marc,这很好。由于一些许可问题,我不确定是否可以使用它。我必须检查一下,但谢谢。我想给您答案,因为您回答了我隐藏的未询问的问题,我感谢您。不过,其他人回答了我问的关于收益率用法的确切问题。想法?
public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(
    this IEnumerable<TFrom> list, TypeConverter converter)
{
    return list.Select(item => PropertyCopy<TTo>.CopyFrom<TFrom>(item);
}