Range型と..演算子
範囲式でスライスを取得します。
「Range型と..演算子」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
Range 型を知る
System.Range は、開始と終了の Index を使ってシーケンスの一部分を表します。範囲演算子 .. と組み合わせることで、サブシーケンスを表現できます。
using System;
Range r = 1..3;
Console.WriteLine(r.Start + ".." + r.End); // 1..3..(範囲)演算子
範囲演算子 a..b は、インデックス a から(含む)インデックス b まで(含まない)の Range を作成します。したがって、1..3 は位置 1 と 2 を対象にします。
using System;
int[] data = { 10, 20, 30, 40, 50 };
int[] slice = data[1..3];
Console.WriteLine(string.Join(",", slice)); // 20,30開始は含み、終了は含まない
終了を含まない仕様は for ループの動作と同じです。要素数は end - start になります。範囲 2..5 は 3 つの要素を返します。
using System;
int[] data = { 0, 1, 2, 3, 4, 5, 6 };
int[] slice = data[2..5];
Console.WriteLine(slice.Length); // 3
Console.WriteLine(string.Join(",", slice)); // 2,3,4上限または下限を省略した範囲
どちらか一方の境界を省略できます。..3 は「先頭から 3 まで」、2.. は「2 から末尾まで」を意味します。.. だけを指定すると、シーケンス全体をコピーします。
using System;
int[] d = { 10, 20, 30, 40, 50 };
Console.WriteLine(string.Join(",", d[..3])); // 10,20,30
Console.WriteLine(string.Join(",", d[2..])); // 30,40,50
Console.WriteLine(string.Join(",", d[..])); // 10,20,30,40,50末尾からのインデックスを使う範囲
.. と ^ を組み合わせると、末尾を基準に切り出せます。^2.. は「最後の 2 つの要素」を意味します。
using System;
int[] d = { 1, 2, 3, 4, 5 };
Console.WriteLine(string.Join(",", d[^2..])); // 4,5
Console.WriteLine(string.Join(",", d[..^1])); // 1,2,3,4 (drop last)格納された値としての Range
Range は名前を付けて、同じ長さの規則を持つ異なるコレクション間で再利用できる値です。
using System;
Range middle = 1..^1; // drop first and last
int[] a = { 0, 1, 2, 3, 4 };
Console.WriteLine(string.Join(",", a[middle])); // 1,2,3Range.GetOffsetAndLength
具体的な長さに対して範囲を解決するには、GetOffsetAndLength(length) を呼び出します。末尾からのインデックスを自動的に処理し、開始オフセットと切り出す長さを返します。
using System;
Range r = ^3..^1;
var (offset, length) = r.GetOffsetAndLength(5);
Console.WriteLine(offset + " " + length); // 2 2Range.All
静的メンバーの Range.All は .. と同じで、シーケンス全体を選択します。範囲を引数として渡す場合に便利です。
using System;
Range whole = Range.All;
int[] d = { 9, 8, 7 };
Console.WriteLine(string.Join(",", d[whole])); // 9,8,7Range を明示的に構築する
演算子のほかに、コンストラクターやファクトリーメソッドの Range.StartAt と Range.EndAt を呼び出して、意図を明確にすることもできます。
using System;
Range a = new Range(1, 3);
Range b = Range.StartAt(2);
Range c = Range.EndAt(2);
Console.WriteLine(a + " | " + b + " | " + c);空の範囲と無効な範囲
開始と終了が等しい範囲は、空のスライスになります。解決後に開始位置が終了位置を超える範囲は、スライスする際に例外をスローします。
using System;
int[] d = { 1, 2, 3, 4 };
Console.WriteLine(d[2..2].Length); // 0 (empty)
try { var _ = d[3..1]; }
catch (ArgumentOutOfRangeException) { Console.WriteLine("invalid range"); }すべてを組み合わせる
範囲を使うと、テキストや配列の処理を簡潔に記述できます。ここでは、インデックスの計算をせずに配列の中央部分を切り出します。
using System;
int[] readings = { 5, 7, 9, 11, 13, 15 };
int[] window = readings[1..^1];
Console.WriteLine(string.Join(",", window)); // 7,9,11,13簡単な確認
範囲演算子の意味を理解できているか確認してください。
まとめ
System.Range は、.. 演算子を使ってスライスを表すことを学びました。
- 開始は含み、終了は含みません。要素数は end - start です。
- 境界は省略できます。
..3、2..、..のように記述します。 ..は^と組み合わせて、末尾を基準に切り出せます。GetOffsetAndLength(length)を使うと、範囲を具体的な数値に解決できます。
よくある質問
「Range型と..演算子」レッスンは無料ですか?
はい。「Range型と..演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「Range型と..演算子」で何を学びますか?
範囲式でスライスを取得します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Range型と..演算子」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Index型と^演算子
- Range型と..演算子
- 配列と文字列の範囲
- 範囲をサポートするカスタム型