Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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中的迭代器参数#_C#_Generics_Iterator_Ienumerable - Fatal编程技术网

C# 泛型函数C中的迭代器参数#

C# 泛型函数C中的迭代器参数#,c#,generics,iterator,ienumerable,C#,Generics,Iterator,Ienumerable,我想做一个convertAll泛型函数,比如 public static Iout ConvertAll<Iin, Iout, T, TOutput>(this Iin source, Converter<T, TOutput> converter) where Iin : IEnumerable<T> where Iout : IEnumerable<TOutput> { foreach (

我想做一个convertAll泛型函数,比如

public static Iout ConvertAll<Iin, Iout, T, TOutput>(this Iin source, Converter<T, TOutput> converter)
        where Iin : IEnumerable<T>
        where Iout : IEnumerable<TOutput>
    {
        foreach (var item in source)
            yield return converter(item);
    }
公共静态Iout ConvertAll(此Iin源,转换器)
其中Iin:IEnumerable
何处Iout:IEnumerable
{
foreach(源中的var项)
收益-收益转换器(项目);
}
问题是visual studio告诉我:

“Sgd.CollectionExtensions.ConvertAll(Iin,System.Converter)”的主体不能是迭代器块,因为“Iout”不是迭代器接口类型

问题是我有where子句,所以它应该像迭代器一样被识别,不是吗

我还尝试:

public static I<TOutput> ConvertAll<I, T, TOutput>(this I<T> source, Converter<T, TOutput> converter)
        where I : IEnumerable
    {
        foreach (var item in source)
            yield return converter(item);
    }
publicstatici-ConvertAll(此I源,转换器)
我在哪里:我数不清
{
foreach(源中的var项)
收益-收益转换器(项目);
}
但是它说

类型参数“I”不能与类型参数一起使用

所以我不知道该怎么办。 我不想要这样的函数:

public static IEnumerable<TOutput> ConvertAll<T, TOutput>(this IEnumerable<T> source, Converter<T, TOutput> converter)
    {
        foreach (var item in source)
            yield return converter(item);
    }
公共静态IEnumerable ConvertAll(此IEnumerable源,转换器)
{
foreach(源中的var项)
收益-收益转换器(项目);
}
它简单得多,而且可以工作,但是它返回一个IEnumerable,我希望输出中的迭代器与输入中的迭代器相同

希望你能帮助我
谢谢

所以我们假设您希望输出是一个
列表
<代码>列表实现了
IEnumerable
。您在哪里定义新列表的创建?您在哪里定义如何将新项目添加到列表

你不是

yield return
意味着构造的类将实现
IEnumerable
IEnumerator
。这就是它知道如何构造的全部内容。您可以接受非
IEnumerable
的输入。例如,您可以接受
列表
的输入。但是,同样,即使使用最后一个函数(您不喜欢的函数),也可以这样做,您不需要使用前面的语法来获得该功能

您可以为所需的两个操作添加其他委托参数(或者实际上是一个,因为您可以为创建添加通用约束)

公共静态TOut ConvertAll(此TIn源代码
,转换器
,动作加法器)
何处锡:IEnumerable
where TOut:IEnumerable,new()
{
TOut输出=新TOut();
foreach(源中的var项)
加法器(输出、转换器(项));
返回输出;
}

请注意,这样做的结果是您丢失了所有延迟执行。

编译器不知道如何创建用户传递的任何类型参数(例如,
ControlCollection
),尤其是迭代器类型是编译器生成器类型,它们只继承
IEnumerable
<代码>列表不能是迭代器。@SLaks或
IEnumerator
;它们可以是这两个选项中的任何一个。@SLaks我不明白我说Iin是一个ienumerable,所以编译器知道?为什么不知道如何使用第三个选项
ConvertAll
?是的,对于List是正确的,但是让我们说我有一个entityCollection或controlCollection的集合,我想使用它entityCollection@bobzer同样的逻辑。这个方法如何知道如何构造它?它如何知道如何添加项目?对不起,我不明白您的意思mean@bobzer你所要求的是不可能的,因为你没有在该方法中提供足够的信息来完成你所要求的。@bobzer当然,只要有代表就行了。
public static TOut ConvertAll<TIn, TOut, T, TOutput>(this TIn source
    , Converter<T, TOutput> converter
    , Action<TOut, TOutput> adder)
    where TIn : IEnumerable<T>
    where TOut : IEnumerable<TOutput>, new()
{
    TOut output = new TOut();
    foreach (var item in source)
        adder(output, converter(item));
    return output;
}