c# - 通用扩展方法可以返回 IEnumerable 类型吗?

标签 c# generics types extension-methods ienumerable

我想编写一个具有通用参数的扩展。 让我用代码来展示。

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> value, int countOfEachPart) 
{
    //spliting value
}

此方法始终返回 IEnumerable<IEnumerable<T>>
但我想返回类似的想法IEnumerable<TList<T>>

例如;
如果我通过了List<T>我应该返回IEnumerable<List<T>>
如果我通过了T[]我应该返回IEnumerable<T>[]
等等


我尝试了这段代码,但没有成功

public static IEnumerable<TList<T>> Split<TList,T>(this TList<T> value, int countOfEachPart) where TList:IEnumerable<T> //or where TList:IEnumerable
{
    //spliting value
}

有没有办法返回传递的 IEnumerable 类型?

最佳答案

因为无论如何您很可能必须实现对数组和列表的支持,所以您必须编写重载方法。

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) 

关于该方法的逻辑(实际上不是问题的一部分,但已在您自己的答案中讨论过):我已经实现了类似的方法,仅基于 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++;
        }
    }

由于 ToArray,我对此不太满意。我更喜欢一个解决方案,其中整个事情尽可能懒惰,并且仅在迭代结果时迭代源。这会有点复杂,而且我没有时间。但是,稍后可以轻松地用更好的实现来替换它。

关于c# - 通用扩展方法可以返回 IEnumerable 类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32139492/

相关文章:

c# - 多个类共享一个方法

c# - 在 C# 中应该如何测试变量是否为值类型?

c# - 同时检查多个 URL 的页面加载时间

c# - 在编辑器中分配脚本而不是游戏对象?

c# - 限制类型参数

python - Pandas :在多索引数据框中转换索引类型

haskell - Haskell 在完整性检查中缺少什么?

types - Agda 中的大小类型是什么?

c# - UseWindowsAzureActiveDirectoryBearerAuthentication 如何验证 token ?

c# - 将通用集合转换为字符串列表