我想模仿通用数组的String.Split功能。

我想出了这种方法,似乎可以双打。

public static double[][] Split(this double[] vals, double t)
{
    List<double[]> ret = new List<double[]>();

    int last = -1;
    for (int i = 0; i <= vals.Length; i++)
    {
        if (i != vals.Length && vals[i] != t)
            continue;

        int len = i - last - 1;
        if (len <= 0)
        {
            last = i;
            continue;
        }

        double[] arr = new double[len];
        Array.Copy(vals, last + 1, arr, 0, len);
        last = i;

        ret.Add(arr);
    }

    return ret.ToArray();
}


而这个是泛型的...

public static T[][] Split<T>(this T[] vals, T t) where T : EqualityComparer<T>
{
    List<T[]> ret = new List<T[]>();

    int last = -1;
    for (int i = 0; i <= vals.Length; i++)
    {
        if (i != vals.Length && vals[i] != t)
            continue;

        int len = i - last - 1;
        if (len <= 0)
        {
            last = i;
            continue;
        }

        T[] arr = new T[len];
        Array.Copy(vals, last + 1, arr, 0, len);
        last = i;

        ret.Add(arr);
    }

    return ret.ToArray();
}


因此,我有三个问题:


有更好的/通用C#方法吗?
如何使模板方法起作用? (我在vals[i] != t上收到错误)-现在已修复
我怎样才能做得更好(IMO,目前有点丑陋)


用法示例:

double[] vals = new double[] { 0, 1, 2, 0, 0, 2, 3, 0, 4, 5, 6 };
double[][] res = vals.Split(0);

// res[0] = [1, 2]
// res[1] = [2, 3]
// res[2] = [4, 5, 6]

最佳答案

您可以使用以下通用扩展方法通过一些分隔符拆分序列。它使用默认比较器将每个项目与分隔符进行比较。

public static IEnumerable<T[]> Split<T>(this IEnumerable<T> source, T separator)
{
    List<T> bucket = new List<T>();
    var comparer = Comparer<T>.Default;

    foreach (var item in source)
    {
        if (comparer.Compare(item, separator) != 0)
        {
            bucket.Add(item);
            continue;
        }

        if (bucket.Any())
        {
            yield return bucket.ToArray();
            bucket = new List<T>();
        }
    }

    if (bucket.Any())
        yield return bucket.ToArray();
}


用法:

double[] vals = new double[] { 0, 1, 2, 0, 0, 2, 3, 0, 4, 5, 6 };
double[][] res = vals.Split(0).ToArray();

关于c# - 如何拆分通用数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15841702/

10-16 20:33