C# 泛型扩展方法可以返回IEnumerable的类型吗?
我想写一个具有泛型参数的扩展。 让我用代码演示一下C# 泛型扩展方法可以返回IEnumerable的类型吗?,c#,generics,types,extension-methods,ienumerable,C#,Generics,Types,Extension Methods,Ienumerable,我想写一个具有泛型参数的扩展。 让我用代码演示一下 public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> value, int countOfEachPart) { //spliting value } 是否有任何方法返回传递的IEnumerable类型?TList是一个类型参数-它不是泛型。但这不一定是: public static IEnumer
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> value, int countOfEachPart)
{
//spliting value
}
是否有任何方法返回传递的IEnumerable类型?
TList
是一个类型参数-它不是泛型。但这不一定是:
public static IEnumerable<TList> Split<TList,T>
(this TList value, int countOfEachPart)
where TList: IEnumerable<T>
公共静态IEnumerable拆分
(此TList值,每个部分的整数)
where-TList:IEnumerable
遗憾的是,这不允许类型推断,
t
..TList
是一个类型参数-它不是泛型的。但这不一定是:
public static IEnumerable<TList> Split<TList,T>
(this TList value, int countOfEachPart)
where TList: IEnumerable<T>
公共静态IEnumerable拆分
(此TList值,每个部分的整数)
where-TList:IEnumerable
遗憾的是,这不允许
t
..的类型推断,因为您很可能必须实现对数组和列表的支持,无论如何,您必须编写重载方法
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> value, int countOfEachPart)
public static IEnumerable<IList<T>> Split<T>(this IList<T> value, int countOfEachPart)
public static IEnumerable<T[]> Split<T>(this T[] value, int countOfEachPart)
公共静态IEnumerable拆分(此IEnumerable值,int countOfEachPart)
公共静态IEnumerable拆分(此IList值,int countOfechPart)
公共静态IEnumerable拆分(此T[]值,int countOfEachPart)
关于方法的逻辑(这实际上不是问题的一部分,但在您自己的回答中已经讨论过):我实现了一个类似的方法,仅基于IEnumerables。看起来是这样的:
public static IEnumerable<IEnumerable<T>> Page<T>(this IEnumerable<T> source, int pageSize)
{
T[] sourceArray = source.ToArray();
int pageCounter = 0;
while (true)
{
if (sourceArray.Length <= pageCounter * pageSize)
{
break;
}
yield return sourceArray
.Skip(pageCounter * pageSize)
.Take(pageSize);
pageCounter++;
}
}
公共静态IEnumerable页(此IEnumerable源,int pageSize)
{
T[]sourceArray=source.ToArray();
int pageCounter=0;
while(true)
{
如果(sourceArray.Length因为您很可能必须实现对数组和列表的支持,那么您必须编写重载方法
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> value, int countOfEachPart)
public static IEnumerable<IList<T>> Split<T>(this IList<T> value, int countOfEachPart)
public static IEnumerable<T[]> Split<T>(this T[] value, int countOfEachPart)
公共静态IEnumerable拆分(此IEnumerable值,int countOfEachPart)
公共静态IEnumerable拆分(此IList值,int countOfechPart)
公共静态IEnumerable拆分(此T[]值,int countOfEachPart)
关于方法的逻辑(这实际上不是问题的一部分,但在您自己的回答中已经讨论过):我实现了一个类似的方法,仅基于IEnumerables。它看起来如下:
public static IEnumerable<IEnumerable<T>> Page<T>(this IEnumerable<T> source, int pageSize)
{
T[] sourceArray = source.ToArray();
int pageCounter = 0;
while (true)
{
if (sourceArray.Length <= pageCounter * pageSize)
{
break;
}
yield return sourceArray
.Skip(pageCounter * pageSize)
.Take(pageSize);
pageCounter++;
}
}
公共静态IEnumerable页(此IEnumerable源,int pageSize)
{
T[]sourceArray=source.ToArray();
int pageCounter=0;
while(true)
{
if(sourceArray.Length
我完成了我的分机。
我同时使用了@Stefan Steinegger和@Luaan答案。谢谢
这是我扩展的最后代码。
我愿意接受你的批评和建议
公共静态类扩展
{
私有静态IEnumerable拆分(此TList值,int countOfEachPart),其中TList:IEnumerable
{
int cnt=value.Count()/countOfEachPart;
列表结果=新列表();
对于(inti=0;iptodictionary(k=>k.Key,v=>v.Value));
返回结果;
}
公共静态IEnumerable拆分(此IList值,int countOfechPart)
{
返回值.拆分(每个部分的计数);
}
公共静态IEnumerable拆分(此T[]值,int countOfEachPart)
{
返回值.拆分(每个部分的计数);
}
公共静态IEnumerable拆分(此IEnumerable值,int countOfEachPart)
{
返回值.拆分(每个部分的计数);
}
}
我完成了我的分机。
我同时使用了@Stefan Steinegger和@Luaan答案。谢谢
这是我扩展的最后代码。
我愿意接受你的批评和建议
公共静态类扩展
{
私有静态IEnumerable拆分(此TList值,int countOfEachPart),其中TList:IEnumerable
{
int cnt=value.Count()/countOfEachPart;
列表结果=新列表();
对于(inti=0;iptodictionary(k=>k.Key,v=>v.Value));
返回结果;
}
公共静态IEnumerable拆分(此IList值,int countOfechPart)
{
返回值.拆分(每个部分的计数);
}
公共静态IEnumerable拆分(此T[]值,int countOfEachPart)
{
返回值.拆分(每个部分的计数);
}
公共静态IEnumerable拆分(此IEnumerable值,int countOfEachPart)
{
返回值.拆分(每个部分的计数);
}
}
ReturnIEnumerable
而不是IEnumerable
@TimSchmelter首先我这样编码,但这总是返回IEnumerable,但我想返回传递的参数类型。如果我传递了List,则应返回List,但此代码将返回IEnumerable。ReturnIEnumerable
而不是IEnumerable
@TimSchmelter首先我这样编码,但这总是返回IEnumerable,但我想返回传递的参数类型。如果我传递了List,则应返回List,但此代码将返回IEnumerable。这是一个很好的解决方案。但这次我必须像调用List.Split(100)那样调用此方法所以我不喜欢这个,不过还是要谢谢你you@dermanyon是的,因此“很遗憾,这不允许t
”的类型推断:))这是一个C#的限制,偶尔会有伤害。你说的对。你说的对。第一次我不明白你的意思。对不起我的英语。谢谢。这是一个很好的解决方案。但是这次我必须像list.Split(100);
那样调用这个方法,所以我不喜欢这个。但即使如此,谢谢you@dermanyon是的,因此“遗憾的是,这不允许t
":)这是一个C#的限制,偶尔会受伤。你说的对。你说的对。我第一次听不懂你的意思。对不起我的英语。谢谢。是的@Stefan Steinegger它看起来像是解决我问题的唯一方法。我会用这个。谢谢。是的@Stefan Steinegger它看起来像是解决我问题的唯一方法。我会用这个谢谢。<代码> Value.CONTUTE()/CUT>变化不坏。