目前,我正在使用这个c# 8.0名为range的新功能。
到目前为止,我有一个问题。我可以range从头到尾创建一个吗?
可以说我有一个array,我想通过range以下方式将其打印出来:
static void Test()
{
int[] array = new int[10];
for (int i = 0; i < 10; i++) array[i] = i;
Range range = ^1..0;
foreach (int v in array[range]) WriteLine(v);
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个运行时错误- System.OverflowException: 'Arithmetic operation resulted in an overflow.'那么我是正确的,只允许一个方向(从开始到结束)ranges吗?
我找不到任何表明这是可能的事情。但是,它似乎不是语言限制,因为我们可以创建一个像Range r = 5..1;and 这样的范围,它不会抛出异常,所以它必须是Array[Range]and 其他类型的实现,比如不接受它的 string 。也就是说,您可能可以创建一个接受 aRange并执行您想要的操作的方法。
编辑:我制作了以下适用于数组的方法:
static T[] MySlice<T>(T[] array, Range r)
{
//Transforms indexes "from end" to indexes "from start"
if(r.Start.IsFromEnd){
var startIdx = array.Length - r.Start.Value;
r = new Range(startIdx,r.End);
}
if(r.End.IsFromEnd){
var endIdx = array.Length - r.End.Value;
r = new Range(r.Start,endIdx);
}
//Check if start value is greater than end value. If so, invert it
if(r.Start.Value > r.End.Value)
{
r = new Range(r.End,r.Start);
var invArr = array[r];
Array.Reverse(invArr);
return invArr;
}
return array[r];
}
Run Code Online (Sandbox Code Playgroud)
你可以使用像
int[] arr = Enumerable.Range(0,10).ToArray();
Range r = ^0..0;
foreach(var v in MySlice(arr,r)){
Console.WriteLine(v);
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |