知らない記法が目白押し。
成果物
情報源
言語サポート
- System.Index
^
は末尾からの相対位置を示すプレフィクス
- System.Range
..
で範囲を示す
- System.Span: System.Memory.dll
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はスタックに保存される。バイナリなど速度が必要な要件で使う構造体らしい。
- https://qiita.com/GlassGrass/items/cea3c6f91413c3582b5f
- https://ufcpp.net/study/csharp/resource/span/
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux