C# ILST的方法签名<;T>;。Split()扩展方法

C# ILST的方法签名<;T>;。Split()扩展方法,c#,generics,.net-3.5,extension-methods,C#,Generics,.net 3.5,Extension Methods,我希望能够编写以下代码: // contains 500 entries IList<string> longListOfStrings = ... // shorterListsOfStrings is now an array of 5 IList<string>, // with each element containing 100 strings IList<string>[] shorterListsOfStrings = longListOfS

我希望能够编写以下代码:

// contains 500 entries
IList<string> longListOfStrings = ...

// shorterListsOfStrings is now an array of 5 IList<string>,
// with each element containing 100 strings
IList<string>[] shorterListsOfStrings = longListOfStrings.Split(5);
但是当我试图编译它时,编译器告诉我,
IList
ICollection
IEnumerable
需要一个类型参数。因此,我将定义更改为:

public static TList[] Split<TList>(this TList source, int elementCount)
  where TList : IList<>, ICollection<>, IEnumerable<>, IList, ICollection, IEnumerable
{
  return null;
}
public static TList<TType>[] Split<TList<TType>>(this TList<TType> source, int elementCount)
  where TList : IList<TType>, ICollection<TType>, IEnumerable<TType>, IList, ICollection, IEnumerable
{
  return null;
}
publicstatictlist[]拆分(此TList源,int elementCount)
其中TList:IList,ICollection,IEnumerable,IList,ICollection,IEnumerable
{
返回null;
}

但是编译器抱怨它找不到类型
TList
。我有一个想法,我是过度复杂的事情,但我不知道如何。。。感谢您的帮助

是的,我认为你把事情复杂化了。试试这个:

public static IList<T>[] Split<T>(this IList<T> source, int elementCount)
{
    // What the heck, it's easy to implement...
    IList<T>[] ret = new IList<T>[(source.Count + elementCount - 1) 
                                  / elementCount];
    for (int i = 0; i < ret.Length; i++)
    {
        int start = i * elementCount;
        int size = Math.Min(elementCount, source.Count - i * start);
        T[] tmp = new T[size];
        // Would like CopyTo with a count, but never mind
        for (int j = 0; i < size; j++)
        {
            tmp[j] = source[j + start];
        }
        ret[i] = tmp;
    }
    return ret;
}
公共静态IList[]拆分(此IList源,int elementCount)
{
//见鬼,它很容易实现。。。
IList[]ret=new IList[(source.Count+elementCount-1)
/元素计数];
对于(int i=0;i
毕竟,您不会更改在基于源的方法中创建的列表类型,是吗?您可能会创建一个
列表
(或者可能是一个
T[]
),即使我传入了一些其他实现

您可能需要查看基于
IEnumerable的实现。

如何:

public static IList<TResult>[] Split<TSource, TResult>(
    this IList<TSource> source,      // input IList to split
    Func<TSource, TResult> selector, // projection to apply to each item
    int elementCount                 // number of items per IList
) {
    // do something        
}
公共静态IList[]拆分(
此IList源,//输入要拆分的IList
Func选择器,//要应用于每个项的投影
int elementCount//每个IList的项目数
) {
//做点什么
}
如果您不需要版本来投影每个项目:

 public static IList<T>[] Split<T>(
    this IList<T> source, // input IList to split
    int elementCount      // number of items per IList
) {
      return Split<T, T>(source, x => x, elementCount);      
}
公共静态IList[]拆分(
此IList源,//输入要拆分的IList
int elementCount//每个IList的项目数
) {
返回分割(source,x=>x,elementCount);
}

谢谢Jon,打字时间太长了!哈