rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 8.0 - インデックスと範囲

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

インデックスと範囲

 https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/ranges-indexes
 二つの型(構造体)と二つの演算子が追加された。
 ・System.Index 型 インデックスを表す
 ・System.Range 型 範囲を表す
 ・^ 演算子 末尾からを表す
 ・.. 演算子 範囲を表す

 二つの型の関係は System.Range のコンストラクタを見るとわかりやすい。先頭のインデックスと末尾のインデックスを持つのが範囲だとわかる。

Range (System.Index start, System.Index end)

 インデックスもコンストラクタを見るとわかりやすい。何番目なのかを表す数値と先頭からなのか末尾なのかを表すフラグを持っている。

Index (int value, bool fromEnd = false)

 演算子はそれぞれ次のように使える。

// System.Index
System.Index index1 = 1;
System.Index index2 = ^1;  // 演算子 ^

// System.Range
System.Range range1 = index1..index2;  // 演算子 ..

 範囲の指定例

// System.Index と .. を使って
System.Range range1 = index1..index2;  // index1 から index2 まで
System.Range range2 = index1..;        // index1 から末尾まで
System.Range range3 = ..index2;        // 先頭から index2 まで

// ^ と .. を使って
System.Range range1 = 1..2;
System.Range range2 = ^1..1;
System.Range range3 = ^2..^1;

// 配列での使用例
var array = new[] { "1", "2", "3", "4" };
Console.WriteLine(string.Join(", ", array[1]));     // 2
Console.WriteLine(string.Join(", ", array[^1]));    // 4        (一番後方が ^1)
Console.WriteLine(string.Join(", ", array[1..^0])); // 2, 3, 4(一番後方が ^0)