C# 泛型函数C中的迭代器参数#
我想做一个convertAll泛型函数,比如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 (
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;
}