rksoftware

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

C# 8 の確認 - インデックスと範囲

今回は インデックスと範囲 です。この機能も .NET Core 3 のプレビューのバージョンアップのたびに言及されてきた機能なので関心が高いのではないかなと思います。

公式はこちら

このブログでの目次?はこちら

二つの型

この機能のために二つの型(構造体)が追加されました。

  • System.Index
    インデックスを表す
  • System.Range
    範囲を表す

この二つの型の関係は System.Range のコンストラクタを見るとわかりやすいです。

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

先頭のインデックスと末尾のインデックスを持つのが範囲です。
そして、インデックスも System.Index のコンストラクタを見るとわかりやすいです。

Index (int value, bool fromEnd = false)

何番目なのかを表す数値と先頭からなのか末尾なのかを表すフラグを持っています。

対となる演算子

  • ^
    末尾からを表す
  • ..
    範囲を表す

次のように System.Index 型の変数へ代入できます。

System.Index index1 = 1;
System.Index index2 = ^1;

そして、次の様に System.Range に代入できます。

System.Range range1 = index1..index2;

範囲の指定方法

先頭だけ、末尾だけの指定も可能です。その場合、末尾まで、先頭からになります。

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" };
{ // 末尾から1番目(一番後方が 1)
    System.Index index = ^1;
    string val = array[index];
    Console.WriteLine(val); // "4"
}
{ // 先頭から一番目(一番先頭が 0)
    System.Index index = 1;
    string val = array[index];
    Console.WriteLine(val); // "2"
}

範囲

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)

素晴らしいですね。積極的に使っていきたいです。注意点としては .NET Framework では使えないことでしょうか? .NET Core 3 で作ればいいだけなので些細なことですね。