やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#チュートリアル(インデックスと範囲。Index,Range,Span)

 知らない記法が目白押し。

成果物

情報源

言語サポート

Type Index Range
Array
String
Span
ReadonlySpan
List

プロジェクト生成

dotnet new console -o Index_Range_Span
cd Index_Range_Span

コード

 配列を生成する。

string[] words = new string[]
{
                // index from start    index from end
    "The",      // 0                   ^9
    "quick",    // 1                   ^8
    "brown",    // 2                   ^7
    "fox",      // 3                   ^6
    "jumped",   // 4                   ^5
    "over",     // 5                   ^4
    "the",      // 6                   ^3
    "lazy",     // 7                   ^2
    "dog"       // 8                   ^1
};              // 9 (or words.Length) ^0

範囲(Range)

リテラル

words[^1]
words[0..^0]
words[0..words.Length]
words[1..4]
words[^2..^0]
words[..]
words[..4]
words[6..]

リテラルを変数に代入する

Range range = 1..4;
Console.WriteLine($"{words[range]}");

コンストラクトから生成する

using System.Linq;

int[] nums = Enumerable.Range(0, 10).ToArray();
Console.WriteLine($"nums.Length: {nums.Length}");
Console.WriteLine($"nums: {nums}");

プロパティ

  • Range.Start
  • Range.End

Span

int[] nums = Enumerable.Range(0, 10).ToArray();
Range range = 1..4;
Span<int> span0 = nums[range];

Console.WriteLine($"{span0.Length}");
Console.WriteLine($"{span0[0]}");
Console.WriteLine($"{span0[^1]}");
Console.WriteLine($"{span0.Slice(2).Length}");

 ReadOnlySpan<T>も使える。

 Spanはスタックに保存される。バイナリなど速度が必要な要件で使う構造体らしい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux