我想编写一个具有通用参数的扩展。 让我用代码来展示。
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/