Я не мог найти ничего, что говорит, что это возможно.Но, похоже, это не является языковым ограничением, поскольку мы можем создать диапазон, например Range r = 5..1;
, и он не генерирует исключения, поэтому это должна быть реализация Array[Range]
и других типов, таких как строка, которая не 'Я не принимаю это.Таким образом, вы, вероятно, можете создать метод, который принимает Range
и делает то, что вы хотите.
Редактировать: я сделал следующий метод, который работает с массивами:
static T[] MySlice<T>(T[] array, Range r)
{
//Transforms indexes "from end" to indexes "from start"
if(r.Start.ToString()[0] == '^'){
var startIdx = array.Length - r.Start.Value;
r = new Range(startIdx,r.End);
}
if(r.End.ToString()[0] == '^'){
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];
}
И выможно использовать как
int[] arr = Enumerable.Range(0,10).ToArray();
Range r = ^0..0;
foreach(var v in MySlice(arr,r)){
Console.WriteLine(v);
}
Какие выходные данные:
9
8
7
6
5
4
3
2
1
0
Редактировать: в документации сказано, что Index
es имеет логическое свойство с именем FromEnd
, которое указывает, является ли индекс концом.Во время моих тестов я обнаружил, что имя реализованного свойства (в ядре dotnet 3.0.100-preview3-010431) равно IsFromEnd
.Поскольку дотнет-ядро 3 все еще находится в бета-версии, название может измениться, поэтому я придерживаюсь r.Start.ToString()[0] == '^'
, чтобы выяснить, является ли Index
от конца, пока до окончательного выпуска дотнет-ядра 3. 3. 1020 *