如何使用范围打印出反向数组?

isx*_*ker 7 c# range c#-8.0

目前,我正在使用这个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吗?

Mag*_*ron 3

我找不到任何表明这是可能的事情。但是,它似乎不是语言限制,因为我们可以创建一个像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)