Open8

C# 逆引きコレクション式

いぬいぬいぬいぬ

目次

内容 書き方
コレクション同士の結合 TCollection c = [..a, ..b];
コレクションのキャスト T2 t2 = [..t1];
コレクションの初期化 TCollection a = [];
コレクションの空の判定 collection is []
同じ値のコレクションを要素数指定して作る TCollection c = [.. Enumerable.Repeat(val, num)]
連番コレクションを作る TCollection c = [.. Enumerable.Range(start, count)]
コレクションを分割して前後入替 c = [..c[index..], ..c[..index]]

補足

「コレクション」はこのページではTCollectionで表現します

ここでいう「コレクション」は,

  • T[] (配列)
  • IEnumerable<T>
  • List<T>
  • Span<T>
    とか。

Dictionary<K,V>とかのディクショナリは「ディクショナリ式」という別のものが
C#14.0?以降に入る予定。

stringもコレクション式が使える場合がある。

いぬいぬいぬいぬ

コレクション同士の結合

コレクション式

//a,bはTCollection
TCollection c = [..a, ..b];

[..【結合するコレクションA】, ..【結合するコレクションB】]でOK。

//3つでも4つでも
List<T> x = [..a, ..b, ..c];

//順番もお好きに
List<T> r = [..c, ..b, ..a];

古い書き方

Concat()だったりAppend()だったり、そもそも結合するメソッドが無かったり。

//T[]
T[] combinedArray = array1.Concat(array2).ToArray();
//IEnumerable<T>
IEnumerable<T> combinedCollection = collection1.Concat(collection2);
//List<T>
list1.AddRange(list2);
//ImmutableArray<T>
ImmutableArray<T> combinedArray = array1.Append(array2);
//Span<T>
//..CopyTo()とか使って色々めんどくさいので省略..
いぬいぬいぬいぬ

コレクションのキャスト

コレクション式

//t1は別の型TCollection1
TCollection2 t2 = [ ..t1 ];

暗黙の型変換できないものも同じ書き方でキャストできる。

int[] array = [];

//cast
IEnumerable<int> ienumerable = [..array];
IEnumerable<int> ie2 = array; //暗黙の型変換できる
List<int> list = [..array];
Span<int> span = [..array];
Span<int> span2 = array; //暗黙の型変換できる

古い書き方

int[] array = { 1, 2, 3 };
List<int> list = new List<int> { 1, 2, 3 };

//T[] から List<T>
List<int> list = new List<int>(array);
//T[] から Span<T>
Span<int> span = array.AsSpan();
//List<T> から T[]
int[] array = list.ToArray();
//List<T>からSpan<T>
Span<int> span = list.ToArray().AsSpan();
いぬいぬいぬいぬ

コレクションの初期化

コレクション式

TCollection a = [];

どんな場合も基本的に[]

最代入可能なら、[]で空にすることもできる。

List<int> list = [1,2,3];
list = []; //空に

古い書き方

//配列は{}が使えた
int[] array1 = {};
//インターフェイスなんでnewとかできない
IEnumerable<int> ienum1 = Enumerable.Empty<int>();
//newする場合&型が明らかならnew()で省略できる
List<int> list1 = new();
Span<int> span1 = new();
いぬいぬいぬいぬ

コレクションの空の判定

コレクション式

//TCollection collection
collection is []

正確にはパターンマッチのリストパターン。コレクション式と同じ書き方になっている。
nullチェックも同時に行われる。

nullの場合の判定もしたい場合はこう。
collection is null or []

古い書き方

if (array != null && array.Length == 0 )
if (list != null && list.Count == 0)
if (span.Length == 0)
if (text != null && text.Length == 0)
いぬいぬいぬいぬ

同じ値のコレクションを要素数指定して作る

コレクション式

//valueは要素の共通の値
TCollection a = [.. Enumerable.Repeat(value,10)];

Enumerable.Repeat()[]内でspreadするだけでどんな型のコレクションもいける。

古い書き方

int[] array = Enumerable.Repeat(value,10).ToArray();
List<int> list = Enumerable.Repeat(value,10).ToList();
//...
いぬいぬいぬいぬ

連番コレクションを作る

コレクション式

//0から10の連番コレクションを作る
TCollection a = [..  Enumerable.Range(0,10)];

古い書き方

int[] array = Enumerable.Range(0,10).ToArray();
List<int> list = Enumerable.Repeat(0,10).ToList();
//...
いぬいぬいぬいぬ

コレクションを分割して前後入替

コレクション式

TCollection c = [1,2,3,4,5,6];
c = [ ..c[index.. ], ..c[ ..index] ];