本文へスキップ
BecomeCoder

C#文法コース · 第9章 文法をさらに使いこなす · レッスン60

レンジとインデックス(.. と ^)

ブラウザで完結

導入

配列の末尾の要素がほしい」「3番目から5番目までを切り出したい」——こういう操作、length - 1 を計算していませんか。C#には末尾から数えるインデックス ^ と、範囲を表すレンジ .. という専用の書き方があります。

図解

flowchart LR
    A["nums = [10, 20, 30, 40, 50]"] --> B["nums[^1] = 50<br/>(末尾から1番目)"]
    A --> C["nums[1..4] = [20, 30, 40]<br/>(1以上4未満)"]
    style B fill:#e1f5fe
    style C fill:#e8f5e9

サンプル

int[] nums = { 10, 20, 30, 40, 50 };

Console.WriteLine(nums[^1]);   // 50(末尾から1番目。^1 は「最後」)
Console.WriteLine(nums[^2]);   // 40

// レンジ a..b は「a 以上 b 未満」。b は含まない
Console.WriteLine(string.Join(",", nums[1..4]));  // 20,30,40
Console.WriteLine(string.Join(",", nums[..2]));   // 10,20(先頭から2つ)
Console.WriteLine(string.Join(",", nums[3..]));   // 40,50(3番目から最後まで)
  • ^n は「末尾から n 番目」。^1 が最後の要素
  • a..b は半開区間(b は含まない)。.. の左右は省略でき、省略すると端まで
  • 文字列にも使える(text[..3] で先頭3文字)

やってみよう

下のエディタでレンジの端を書き換えて、どの要素が取り出されるかを確かめましょう。nums[^3..] のような組み合わせも試せます。

演習

int[] nums = { 10, 20, 30, 40, 50 };

// TODO: レンジ「..」を使って末尾2要素 {40, 50} を取り出し、カンマ区切りで出力してください
int[] last2 = ___;
Console.WriteLine(string.Join(",", last2));   // 40,50
  • 期待される出力: 40,50
ヒント1を見る

末尾から2つは nums[^2..](末尾から2番目から最後まで)

ヒント2を見る

nums[3..] でも同じ結果になります(0始まりで3番目以降)

まとめ

  • ^n は末尾から数えるインデックス(^1 が最後)
  • a..b は範囲(b は含まない半開区間)
  • 配列にも文字列にも使え、length - 1 の計算から解放される

次回: 変数名や型名を安全に文字列化する nameoftypeof です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。