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)
{
返回值.拆分(每个部分的计数);
}
}

Return
IEnumerable
而不是
IEnumerable
@TimSchmelter首先我这样编码,但这总是返回IEnumerable,但我想返回传递的参数类型。如果我传递了List,则应返回List,但此代码将返回IEnumerable。Return
IEnumerable
而不是
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>变化不坏。