導入
「配列の末尾の要素がほしい」「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の計算から解放される
次回: 変数名や型名を安全に文字列化する nameof と typeof です。