如何在c#中切片双打数组

时间:2014-06-05 16:06:14

标签: c# arrays slice

我有一个简单的问题,但我很难掌握这个概念。

我有一个双打数组(doublesarray),我想切片数组,以便我得到最后一个" x"值。

x可以是2,5,7,12等

示例:

doublesarray = {0,2,4,5,7,8,2,4,6};
doublesarray.slice(-4,-1);

output:
[8,2,4,6]


doublesarray.slice(-2,-1);
output:
[4,6]

尝试:

我在网上发现了一些切片,但它没有处理2个负输入。

public static class Extensions
{
    /// <summary>
    /// Get the array slice between the two indexes.
    /// ... Inclusive for start index, exclusive for end index.
    /// </summary>
    public static T[] Slice<T>(this T[] source, int start, int end)
    {
        // Handles negative ends.
    if (end < 0)
    {
        end = source.Length + end;
    }
    int len = end - start;

    // Return new array.
    T[] res = new T[len];
    for (int i = 0; i < len; i++)
    {
        res[i] = source[i + start];
    }
    return res;
    }
}

4 个答案:

答案 0 :(得分:2)

很抱歉给您带来不便,我只是想通了。我花了这么多时间把它写出去了。

对于将来的任何人,您所做的只是:

doublesarray.slice(doublesarray.Length-x,doublesarray.Length);

答案 1 :(得分:1)

是的,您显示的代码已处理否定结束

if (end < 0)
{
    end = source.Length + end;
}

所以你要做的就是从一开始就是同样的事情:

if (start < 0)
{
    start = source.Length + start;
}

(或使用+=,即start += source.Length。)

请注意,这仍然不会处理负值 - 只有-source.Length的值。

答案 2 :(得分:0)

你也可以使用Linq,因为数组是IEnumerable。

使用TakeReverse和(当且仅当您必须拥有数组时)ToArray

public static double[] slice(this double[] source, int count)
{
    if(Math.Abs(count) > source.Length) throw new ArgumentOutOfRangeException("Count");

    if(count > 0)
        return source
            .Take(count)
            .ToArray();
    else if(count < 0)
        return source
            .Reverse()
            .Take(count * -1)
            .Reverse
            .ToArray();
    else return new double[] { };
}

如果您需要一个前后几步的实施,也可以考虑使用Skip

答案 3 :(得分:0)

我可能会使用Linq并执行:

using System.Collections.Generic;
using System.Linq;

...

var doublesarray = new double[] { 0, 2, 4, 5, 7, 8, 2, 4, 6 };
var slicedarray = doublesarray.Skip(5).Take(4);

您最终会得到IEnumerable<double>

您只需复制/粘贴以下代码即可在CompileOnline.com中进行演示,然后按&#34;编译&amp;执行&#34;按钮

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        var doublesarray = new double[] { 0, 2, 4, 5, 7, 8, 2, 4, 6 };

        Log(doublesarray);

        IEnumerable<double> slicedarray = doublesarray.Skip(5).Take(4);

        Log(slicedarray);
    }

    static void Log(IEnumerable<double> doublesarray)
    {
        foreach (var d in doublesarray)
            Console.WriteLine(d);
        Console.WriteLine("-----");
    }
}

enter image description here