قابلیت Indices and ranges در C# 8

لیست ویژگی های جدید C# 8 :

دسترسی راحت تر به عضو های یک آرایه با این امکان جدید در سی شارپ 8

برای دسترسی به آخرین عضو یک آرایه معمولا به صورت زیر استفاده می شود :

var integerArray = new int[3];
var lastItem = integerArray[integerArray.Length - 1];

در این حالت از آخر شروع به شمارش کرده و یک واحد کم می کند .
و اگر بخواهیم دومین عضو از آخر را دریافت کنیم :

var secondToLast = integerArray[integerArray.Length - 2];

 از آخر شروع به شمارش کرده و 2 واحد ، از ان کم میکند .

این شمارش در سی شارپ توسط عملگر hat یا ^ انجام می شود .

var lastItem = integerArray[^1];

در مثال زیر نمونه از شمارش ایندکس آرایه ها آورده شده است :

var words = new string[]
{
                // index from start    index from end
    "The",      // 0                   ^9
    "quick",    // 1                   ^8
    "brown",    // 2                   ^7
    "fox",      // 3                   ^6
    "jumped",   // 4                   ^5
    "over",     // 5                   ^4
    "the",      // 6                   ^3
    "lazy",     // 7                   ^2
    "dog"       // 8                   ^1
};              // 9 (or words.Length) ^0

ویژگی Index در سی شاپ 8

برای مثال آرایه زیر را در نظر بگیرید :

var myArray = new string[] { "Item1", "Item2", "Item3", "Item4", "Item5" };

برای دریافت Item 2 و Item 3 در سی شارپ 8 به صورت زیر عمل میکنیم :

var fromIndexToX = myArray[1..3]; // = [Item2, Item3] 

در مثال بالا 3..1 به معنای بازه از المان 2 تا 3 می باشد که در اینجا المان معادل ایندکس در آرایه نیست

نکته :‌
ذکر ابتدا و انتها بازه اجباری نیست اگر ابتدا بازه ذکر نشود به معنای عدد صفر و اگر انتهای بازه ذکر نشود به معنای ^0 است .

1^..1 به معنای انتخاب بازه 2 تا یکی به آخر است :

var fromIndexToXFromTheEnd = myArray[1..^1]; // = [ "Item2", "Item3", "Item4" ]

 همان طور که گفتیم ذکر انتهای بازه اجباری نیست میتوانیم به صورت زیر بنویسیم :‌

var fromAnIndexToTheEnd = myArray[1..]; // = [ "Item2", "Item3", "Item4", "Item5" ]

و در ادامه ذکر ابتدا آن هم چون اجباری نیست میتوانیم به صورت زیر بنویسیم :

var fromTheStartToAnIndex = myArray[..3]; // = [ "Item1", "Item2", "Item3" ] 

مثالی دیگر بروی حلقه Foreach :

foreach (var item in myArray[1..4]) // = [ "Item2", "Item3", "Item4" ]
{
  Console.WriteLine(item);
}

ویژگی Range در سی شارپ 8

class Program
    {
        private static readonly int[] _numbers = Enumerable.Range(1, 10).ToArray();
        static void Print(Range range) => Console.WriteLine($"{range} => {string.Join(", ", _numbers[range])}");

        static void Main()
        {
            Print(1..3); // 1..3 => 2, 3
            Print(..3);      // 0..3 => 1, 2, 3
            Print(3..);      // 3..^0 => 4, 5, 6, 7, 8, 9, 10
            Print(1..^1);    // 1..^1 => 2, 3, 4, 5, 6, 7, 8, 9
            Print(^2..^1);   // ^2..^1 => 9
        }
    }

بنابراین میتوانیم از Range بعنوان پارامتر های متد استفاده کنیم .

مثالی دیگر :

Console.WriteLine("123456789"[1..4]); // Would output 234