我有一个简单的问题,但我很难掌握这个概念。
我有一个双打数组(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;
}
}
答案 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。
使用Take,Reverse和(当且仅当您必须拥有数组时)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("-----");
}
}