Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 757

[C#] 配列の性質と基本操作

$
0
0

概要

  • 本稿では,配列の性質と初期化方法,主要な操作の実装方法について解説する.1

配列とは

  • 複数の同型データを纏めて扱うための参照型データ.
  • 配列には,1次元配列,多次元配列,ジャグ配列がある.
  • 配列の要素には,任意の型を指定できる.
  • 次元数と各次元の長さは,配列インスタンスの作成時に設定され,インスタンスの有効期間中にこれらの値を変更することはできない.
  • n個の要素を含む配列には0からn-1までのインデックスが与えられる.
  • 数値配列要素の既定値は0に設定され,参照要素はnullに設定される.
  • ジャグ配列は「配列の配列」であり,各要素の既定値はnullに設定される.

System.Array

  • 全ての配列は抽象クラスSystem.Arrayを継承する.
  • System.ArrayIEnumerableを実装するので,すべての配列に対してforeachステートメントやSystem.Linq拡張メソッドを利用できる.
クラス説明
Array配列の作成,操作,検索,および並べ替えを行うメソッドを提供します.
  • System.Arrayが継承するインターフェースは下記の通り.
インターフェース説明
IEnumerable非ジェネリック コレクションに対する単純な反復処理をサポートする列挙子を公開します.
IListインデックスによって個別にアクセスできるオブジェクトの非ジェネリック コレクションを表します.
ICollectionすべての非ジェネリック コレクションについて,サイズ,列挙子,および同期メソッドを定義します.
ICloneable値は,既存のインスタンスと同じクラスの新しいインスタンスを作成する複製をサポートします.
IStructuralComparableコレクション オブジェクトの構造比較をサポートします.
IStructuralEquatableオブジェクトの構造が等価かどうかの比較をサポートするメソッドを定義します.

配列の初期化

一次元配列

// 型と長さを指定して宣言vararr1=newstring[3];arr1[0]="a";arr1[1]="b";arr1[2]="c";// ブレースで初期値を設定vararr2=newstring[]{"a","b","c"};// 宣言側の型省略string[]arr3={"a","b","c"};// 暗黙的型付け配列vararr4=new[]{"a","b","c"};

多次元配列

// 型と長さを指定して宣言vararr1=newstring[2,2];arr1[0,0]="a";arr1[0,1]="b";arr1[1,0]="c";arr1[1,1]="d";// ブレースで初期値を設定vararr2=newstring[,]{{"a","b"},{"c","d"}};// 宣言側の型省略string[,]arr3={{"a","b"},{"c","d"}};// 暗黙的型付け配列vararr4=new[,]{{"a","b"},{"c","d"}};

ジャグ配列

// 型と長さを指定して宣言vararr1=newstring[2][];arr1[0]=newstring[2];arr1[1]=newstring[3];arr1[0][0]="a";arr1[0][1]="b";arr1[1][0]="c";arr1[1][1]="d";arr1[1][2]="e";// ブレースで初期値を設定vararr2=newstring[][]{newstring[]{"a","b"},newstring[]{"c","d","e"}};// 宣言側の型省略string[][]arr3={newstring[]{"a","b"},newstring[]{"c","d","e"}};// 暗黙的型付け配列vararr4=new[]{new[]{"a","b"},new[]{"c","d","e"}};

配列の操作

値の取得

メソッド説明
GetValue(int index)1 次元配列内の指定した位置にある値をObject型で取得します.
index : 取得する配列の位置.
GetValue(params int[] indices)多次元配列内の指定した位置にある値をObject型で取得します.
indices : 取得する配列の位置を指定するインデックスを表すint型の1次元配列.
// 1次元配列vararr1=new[]{"C","D","E","F","G","A","B"};vars1=arr1[0];// "C":先頭から0番目の値を取得vars2=(string)arr1.GetValue(1);// "D":先頭から1番目の値を取得vars3=arr1[^1];// "B":末尾から1個目の値を取得(C# 8.0-)vars4=arr1[^2];// "A":末尾から2個目の値を取得(C# 8.0-)// 多次元配列vararr2=new[,]{{"香","桂","銀","金","玉","金","銀","桂","香"},{" ","飛"," "," "," "," "," ","角"," "},{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},{" "," "," "," "," "," "," "," "," "},{" "," "," "," "," "," "," "," "," "},{" "," "," "," "," "," "," "," "," "},{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},{" ","角"," "," "," "," "," ","飛"," "},{"香","桂","銀","金","王","金","銀","桂","香"}};varrook1=arr2[1,1];// "飛"varrook2=(string)arr2.GetValue(1,1);// "飛"// ジャグ配列vararr3=new[]{new[]{"香","桂","銀","金","玉","金","銀","桂","香"},new[]{" ","飛"," "," "," "," "," ","角"," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" ","角"," "," "," "," "," ","飛"," "},new[]{"香","桂","銀","金","王","金","銀","桂","香"}};varbishop1=arr3[1][7];// "角"varbishop2=(string)((string[])arr3.GetValue(1)).GetValue(7);// "角"

値の設定

メソッド説明
SetValue(Object value, int index)1次元配列内の指定した位置にある要素に値を設定します.
value : 指定した要素の新しい値.
index : 指定する配列の位置.
SetValue (object value, params int[] indices)多多次元配列内の指定した位置にある要素に値を設定します.
value : 指定した要素の新しい値.
indices : 指定する配列の位置を指定するインデックスを表すint型の1次元配列.
Fill<T>(T[] array, T value)指定された値を,指定された配列の各要素に割り当てます.
Fill<T>(T[] array, T value, int startIndex, int count)指定された値を,指定された配列の各要素に割り当てます.これらの要素は,startIndex (包含) および次の count個のインデックスの範囲内にあります.
array : 入力する配列.
value : 指定された範囲内にある要素に対する新しい値.
startIndex : 入力を開始する配列のインデックス.
count : コピーする要素の数.
// 1次元配列vararr1=new[]{"C","D","E","F","G","A","B"};arr1[0]="A";// { "A", "D", "E", "F", "G", "A", "B" }arr1.SetValue("B",0);// { "B", "D", "E", "F", "G", "A", "B" }Array.Fill(arr1,"A");// { "A", "A", "A", "A", "A", "A", "A" }Array.Fill(arr1,"B",1,5);// { "A", "B", "B", "B", "B", "B", "A" }// 多次元配列vararr2=new[,]{{"香","桂","銀","金","玉","金","銀","桂","香"},{" ","飛"," "," "," "," "," ","角"," "},{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},{" "," "," "," "," "," "," "," "," "},{" "," "," "," "," "," "," "," "," "},{" "," "," "," "," "," "," "," "," "},{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},{" ","角"," "," "," "," "," ","飛"," "},{"香","桂","銀","金","王","金","銀","桂","香"}};arr2[5,2]="歩";arr2.SetValue("歩",5,2);// ジャグ配列vararr3=new[]{new[]{"香","桂","銀","金","玉","金","銀","桂","香"},new[]{" ","飛"," "," "," "," "," ","角"," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" ","角"," "," "," "," "," ","飛"," "},new[]{"香","桂","銀","金","王","金","銀","桂","香"}};arr3[5][2]="歩";((string[])arr3.GetValue(5)).SetValue("歩",2);

長さの取得

プロパティ説明
Length配列のすべての次元内の要素の総数を取得します.
メソッド説明
GetLength(int dimension)配列の指定した次元にある要素の数を取得します.
dimension : 長さを指定する必要がある配列の0から始まる次元.
vararr1=newint[3];varl0=arr1.Length;// 3varl1=arr1.GetLength(0);// 3vararr2=newint[3,5];varl2=arr2.Length;// 15varl3=arr2.GetLength(0);// 3varl4=arr2.GetLength(1);// 5vararr3=new[]{new[]{0,1,2},new[]{0,1,2,3}};varl5=arr3.Length;// 2varl6=arr3[0].Length;// 3varl7=arr3[0].GetLength(0);// 3varl8=arr3[1].Length;// 4varl9=arr3[1].GetLength(0);// 4

次元の取得

プロパティ説明
Rank配列の次元数を取得します.
vararr1=newint[3];vard1=arr1.Rank;// 1vararr2=newint[3,5];vard2=arr2.Rank;// 2vararr3=new[]{new[]{0,1,2},new[]{0,1,2,3}};vard3=arr3.Rank;// 1

配列の生成

メソッド説明
Empty<T>空の配列を返します.
T : 作成する配列の型
CreateInstance(Type elementType, int length)型と長さを指定して,1次元の配列をArray型で作成します.
elementType : 作成する配列の型.
length : 作成する配列の長さ.
CreateInstance(Type elementType, params int[] lengths)型と次元の長さを指定して,多次元配列をArray型で作成します.
elementType : 作成する配列の型.
lengths : 作成する配列の各次元の長さを表す配列.
// 空の配列を作成vararr1=Array.Empty<int>();// new int[0]vararr2=Array.Empty<string>();// new string[0]// 型と長さを指定して配列を作成vararr3=(int[])Array.CreateInstance(typeof(int),2);// new int[2]vararr4=(string[])Array.CreateInstance(typeof(string),3);// new string[3]vararr5=(int[,])Array.CreateInstance(typeof(int),3,2);// new int[3, 2]

初期化

メソッド説明
Initialize値型のパラメーターなしのコンストラクターを呼び出すことで,この値型配列の各要素を初期化します.
このメソッドは,コンストラクターを持つ値型に対してのみ使用できます.
Clear(Array array, int index, int length)配列内にある要素の範囲を,各要素の型の既定値に設定します.
array : 要素を削除する必要がある配列.
index : 削除する要素の範囲の開始インデックス.
length : 削除する要素の数.

シャローコピー2

メソッド説明
Clone配列の簡易コピーをObject型で作成します.
Copy(Array sourceArray, Array destinationArray, int length)一方の配列の要素範囲を他方の配列にコピーします.
sourceArray : コピーするデータを格納している配列.
destinationArray : データを受け取る配列.
length : コピーする要素の数.
Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length)指定したコピー元インデックスを開始位置として Array から要素の範囲をコピーし,指定したコピー先インデックスを開始位置として他の Array にそれらの要素を貼り付けます.
sourceArray : コピーするデータを格納している配列.
sourceIndex : コピー操作の開始位置となる sourceArray内のインデックス.
destinationArray : データを受け取る配列.
length : コピーする要素の数.
ConstrainedCopy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length)指定したコピー元インデックスを開始位置として Array から要素の範囲をコピーし,指定したコピー先インデックスを開始位置として他の Array にそれらの要素を貼り付けます. コピーが完全に成功しない限り,変更は一切適用されません.
sourceArray : コピーするデータを格納している配列.
sourceIndex : コピー操作の開始位置となる sourceArray内のインデックス.
destinationArray : データを受け取る配列.
length : コピーする要素の数.
vararr=new[]{1,2,3,4,5};vararr1=(int[])arr.Clone();// {1, 2, 3, 4, 5}vararr2=newint[5];Array.Copy(arr,arr2,arr2.Length);// {1, 2, 3, 4, 5}vararr3=newint[3];Array.Copy(arr,arr3,arr3.Length);// {1, 2, 3}vararr4=newint[3];Array.Copy(arr,0,arr4,1,2);// {0, 1, 2}vararr5=newint[4];Array.ConstrainedCopy(arr,1,arr5,1,3);// {0, 2, 3, 4}// C# 8.0-vararr6=arr1[0..3];// { 1, 2, 3 }vararr7=arr1[1..^1];// { 2, 3, 4 }varstr1="0123456789";varstr2=str1[1..^1];// "12345678"// Copy と ConstrainedCopy の動作比較Object[]objArray={"The","smallest","prime","number","is",2};varstrArray1=newstring[6];Array.Fill(strArray1,"?");try{Array.Copy(objArray,strArray1,strArray1.Length);}catch(Exceptione){Console.WriteLine(e.GetType().Name);// "InvalidCastException"Console.WriteLine(string.Join(" ",strArray1));// "The smallest prime number is ?"}varstrArray2=newstring[6];Array.Fill(strArray2,"?");try{Array.ConstrainedCopy(objArray,0,strArray2,0,strArray2.Length);}catch(Exceptione){Console.WriteLine(e.GetType().Name);// "ArrayTypeMismatchException"Console.WriteLine(string.Join(" ",strArray2));// "? ? ? ? ? ?"}

探索

メソッド説明
IndexOf<T>(T[] array, T value)指定したオブジェクトを検索し,1次元配列でそのオブジェクトが最初に見つかった位置のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
IndexOf<T>(T[] array, T value, int startIndex)指定されたオブジェクトを1次元配列の要素範囲内で検索し,最初に見つかったオブジェクトのインデックスを返します. 要素範囲は,指定されたインデックスから,配列の最後までの範囲です.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
startIndex : 検索の開始位置を示すインデックス.
IndexOf<T>(T[] array, T value, int startIndex, int count)指定されたオブジェクトを1次元配列の要素範囲内で検索し,最初に見つかったオブジェクトのインデックスを返します. 範囲は,指定されたインデックスから始まり,指定された数の要素を含む範囲です.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
startIndex : 検索の開始位置を示すインデックス.
count : 検索対象の範囲内にある要素の数.
LastIndexOf<T>(T[] array, T value)指定したオブジェクトを配列全体を対象に検索し,インデックス番号の最も大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
LastIndexOf<T>(T[] array, T value, int startIndex)指定したオブジェクトを,配列の先頭の要素から,指定されたインデックス位置までを範囲として検索し,インデックス番号の最も大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
startIndex : 後方検索のの開始位置を示すインデックス.
LastIndexOf<T>(T[] array, T value, int startIndex, int count)指定したオブジェクトを,配列の指定したインデックス位置から,指定した要素数を範囲として検索し,インデックス番号の最も大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
value : 検索するオブジェクト.
startIndex : 後方検索のの開始位置を示すインデックス.
count : 検索対象の範囲内にある要素の数.
FindIndex<T>(T[] array, Predicate match)配列全体から,指定した述語によって定義される条件に一致する要素を検索し,最もインデックス番号の小さい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
match : 検索する要素の条件を定義する述語.
FindIndex<T>(T[] array, int startIndex, Predicate match)配列の指定したインデックスから最後の要素までの範囲内で,指定した述語にで定義される条件に一致する要素を検索し,最初に見つかったインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
startIndex : 検索のの開始位置を示すインデックス.
match : 検索する要素の条件を定義する述語.
FindIndex<T>(T[] array, int startIndex, int count, Predicate match)配列のうち,指定したインデックスから始まり,指定した要素数が含まれる範囲の中で,指定した述語によって定義される条件に一致する要素を検索し,そのうち最もインデックス番号の小さい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
startIndex : 検索のの開始位置を示すインデックス.
count : 検索対象の範囲内にある要素の数.
match : 検索する要素の条件.
FindLastIndex<T>(T[] array, Predicate match)配列全体から,指定した述語によって定義される条件に一致する要素を検索し,最もインデックス番号の大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
match : 検索する要素の条件を定義する述語.
FindLastIndex<T>(T[] array, int startIndex, Predicate match)配列のうち,先頭の要素から指定したインデックスまでの範囲の中で,指定した述語によって定義される条件に一致する要素を検索し,そのうち最もインデックス番号の大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
startIndex : 後方検索のの開始位置を示すインデックス.
match : 検索する要素の条件を定義する述語.
FindLastIndex<T>(T[] array, int startIndex, int count, Predicate match)配列の指定したインデックスで終わる指定した要素数の範囲内で,指定した述語によって定義される条件に一致する要素を検索し,最もインデックス番号の大きい要素のインデックスを返します.
T : 配列要素の型.
array : 検索する1次元の配列.
startIndex : 後方検索のの開始位置を示すインデックス.
count : 検索対象の範囲内にある要素の数.
match : 検索する要素の条件を定義する述語.
Find<T>(T[] array, Predicate match)指定された述語によって定義された条件と一致する要素を検索し,配列全体の中で最もインデックス番号の小さい要素を返します.
T : 配列要素の型.
array : 検索する配列.
match : 検索する要素の条件を定義する述語.
FindLast<T>(T[] array, Predicate match)指定された述語によって定義された条件と一致する要素を,配列全体を対象に検索し,最もインデックス番号の大きい要素を返します.
T : 配列要素の型.
array : 検索する配列.
match : 検索する要素の条件を定義する述語.
FindAll<T>(T[] array, Predicate match)指定された述語によって定義された条件と一致するすべての要素を配列で取得します.
T : 配列要素の型.
array : 検索する配列.
match : 検索する要素の条件を定義する述語.
vararr=new[]{0,1,2,3,2,1,0};varindexOf1=Array.IndexOf(arr,1);// 1varindexOf2=Array.IndexOf(arr,1,3);// 5varindexOf3=Array.IndexOf(arr,1,3,2);// -1varlastIndexOf1=Array.LastIndexOf(arr,1);// 5varlastIndexOf2=Array.LastIndexOf(arr,1,3);// 1varlastIndexOf3=Array.LastIndexOf(arr,1,3,3);// 1varfindIndex1=Array.FindIndex(arr,i=>i%2==1);// 1varfindIndex2=Array.FindIndex(arr,3,i=>i%2==1);// 3varfindIndex3=Array.FindIndex(arr,2,1,i=>i%2==1);// -1varfindLastIndex1=Array.FindLastIndex(arr,i=>i%2==1);// 5varfindLastIndex2=Array.FindLastIndex(arr,3,i=>i%2==1);// 3varfindLastIndex3=Array.FindLastIndex(arr,2,2,i=>i%2==1);// 1varfind1=Array.Find(arr,i=>i%2==1);// 1varfind2=Array.Find(arr,i=>i%2==7);// 0varfindLast1=Array.FindLast(arr,i=>i%2==1);// 1varfindLast2=Array.FindLast(arr,i=>i%2==7);// 0varfindAll1=Array.FindAll(arr,i=>i%2==1);// int[3] {1, 3, 5}varfindAll2=Array.FindAll(arr,i=>i%2==7);// int[0] { }

判定

メソッド説明
Exists<T>(T[] array, Predicate match)指定された配列に,指定された述語によって定義された条件と一致する要素が含まれているかどうかを判断します.
T : 配列要素の型.
array : 検索する配列.
match : 検索する要素の条件を定義する述語.
TrueForAll<T>(T[] array, Predicate match)配列内のすべての要素が,指定された述語によって定義された条件と一致するかどうかを調べます.
T : 配列要素の型.
array : 検索する配列.
match : 検索する要素の条件を定義する述語.
vararr=new[]{1,2,3,4,5};varb1=Array.Exists(arr,i=>i%3==0);// truevarb2=Array.Exists(arr,i=>i%7==0);// falsevarb3=Array.TrueForAll(arr,i=>i>=0);// truevarb4=Array.TrueForAll(arr,i=>i%2==0);// false

ソート

メソッド説明
Sort<T>(T[] array)配列のの各要素のIComparable実装を使用して,1次元配列全体の要素を並べ替えます.
T : 配列要素の型.
array : 並び替える1次元の配列.
Sort<T>(T[] array, int index, int length)配列のの各要素のIComparable実装を使用して,配列内のある要素範囲の要素を並べ替えます.
T : 配列要素の型.
array : 並び替える1次元の配列.
index : 並べ替え対象の範囲の開始位置を示すインデックス.
length : 並べ替え対象の範囲内にある要素の数.
Sort<TKey,TValue>(TKey[] keys, TValue[] items)2つの配列オブジェクト (一方のオブジェクトがキーを格納し,他方のオブジェクトがそれらに対応する項目を格納する) を,最初の 配列内のキーに基づき,各キーによって実装されたIComparable<T>ジェネリック インターフェイスを使用して並べ替えます.
TKey : キー用の配列要素の型.
TValue
: 項目用の配列要素の型.
keys : 並べ替えるキーを格納している1次元配列.
items : keys内のキーに対応する項目が格納されている1次元配列.keysだけを並べ替える場合はnull
Sort<T>(T[] array, IComparer comparer)配列内の要素を,指定したIComparer<T>ジェネリックインターフェイスを使用して並べ替えます.
T : 配列要素の型.
array : 並び替える1次元の配列.
comparer : 要素を比較する際に使用するIComparer<T>ジェネリックインターフェイスの実装.各要素が実装するIComparable<T>ジェネリック インターフェイスを使用する場合はnull
Sort<T>(T[] array, int index, int length, IComparer comparer)指定した IComparer<T>ジェネリックインターフェイスを使用して,配列内の要素の範囲内の要素を並べ替えます.
T : 配列要素の型.
array : 並び替える1次元の配列.
index : 並べ替え対象の範囲の開始位置を示すインデックス.
length : 並べ替え対象の範囲内にある要素の数.
comparer : 要素を比較する際に使用するIComparer<T>ジェネリックインターフェイスの実装.各要素が実装するIComparable<T>ジェネリック インターフェイスを使用する場合はnull
Reverse<T>(T[] array)1 次元のジェネリック配列内の要素のシーケンスを反転させます.
T : 配列要素の型.
array : 反転する要素の1次元配列.
Reverse<T>(T[] array, int index, int length)1次元のジェネリック配列内の要素のサブセットのシーケンスを反転させます.
T : 配列要素の型.
array : 反転する要素の1次元配列.
index : 反転させる対象の範囲の開始位置を示すインデックス.
length : 反転対象の範囲内にある要素の数.
vararr1=new[]{3,5,2,4,1};Array.Sort(arr1);// {1, 2, 3, 4, 5}vararr2=new[]{3,5,2,4,1};Array.Sort(arr2,1,3);// {3, 2, 4, 5, 1}varids=new[]{255,6,0,135,253};varnames=new[]{"けつばん","アネ゙デパミ゙","ィ゛ゃゾ┛A","ベアビヲ9","ダメタマゴ"};Array.Sort(ids,names);// ids, names をぞれぞれ ids を Key にソートConsole.WriteLine(string.Join(", ",Enumerable.Range(0,ids.Length).Select(i=>$"{ids[i]} : {names[i]}")));// 実行結果:"0 : ィ゛ゃゾ┛A, 6 : アネ゙デパミ゙, 135 : ベアビヲ9, 253 : ダメタマゴ, 255 : けつばん"Array.Sort(names,ids);// ids, names をぞれぞれ names を Key にソートConsole.WriteLine(string.Join(", ",Enumerable.Range(0,ids.Length).Select(i=>$"{ids[i]} : {names[i]}")));// 実行結果:"6 : アネ゙デパミ゙, 0 : ィ゛ゃゾ┛A, 255 : けつばん, 253 : ダメタマゴ, 135 : ベアビヲ9"vararr3=new[]{1,2,3,4,5};Array.Sort(arr3,newReverseComparer());// {5, 4, 3, 2, 1}vararr4=new[]{1,2,3,4,5};Array.Sort(arr4,1,3,newReverseComparer());// {1, 4, 3, 2, 5}vararr5=new[]{1,2,3,4,5};Array.Reverse(arr5);// {5, 4, 3, 2, 1}vararr6=new[]{1,2,3,4,5};Array.Reverse(arr6,1,3);// {1, 4, 3, 2, 5}
/// <summary>/// 2つのオブジェクトを入れ替える IComparer を実装します./// </summary>publicclassReverseComparer:IComparer{intIComparer.Compare(objectx,objecty)=>newCaseInsensitiveComparer().Compare(y,x);}

変換

メソッド説明
Resize<T>(ref T[] array, int newSize)1次元配列の要素数を,指定した新しい長さに変更します.
T : 配列要素の型.
array : サイズ変更の対象となる1次元配列.指定した長さの新しい配列を作成する場合はnull
newSize : 新しい配列のサイズ.
ConvertAll<TInput,TOutput> (TInput[] array, Converter converter)ある型の配列を別の型の配列に変換します.
TInput : 元の配列要素の型.
TOutput : 変換後の配列要素の型.
array : 変換元の1次元配列.
converter : 各要素の型を変換するための方法.
AsReadOnly<T>(T[] array)指定した配列をラップする読み取り専用のラッパーReadOnlyCollection<T>を作成します.
T : 配列要素の型.
array : ラップする1次元配列.
AsMemory<T>(this T[] array)挿入先の配列に新しいメモリ領域を作成します.
T : 配列要素の型.
array : 変換する配列.
AsSpan<T>(this T[] array)挿入先の配列に新しいスパンを作成します.
T : 配列要素の型.
array : 変換する配列.
vararr1=new[]{1,2,3,4,5};Array.Resize(refarr1,3);// {1, 2, 3}Array.Resize(refarr1,5);// {1, 2, 3, 0, 0}int[]arr2=null;Array.Resize(refarr2,3);// {0, 0, 0}varrc=Array.AsReadOnly(arr1);// System.Collections.ObjectModel.ReadOnlyCollection<int> {1, 2, 3, 0, 0}varspan=arr1.AsSpan()[1..^1];// System.Span<int>   : [0]|2, [1]|3, [2]|0varmemory=arr1.AsMemory()[1..^1];// System.Memory<int> : [0]|2, [1]|3, [2]|0

実行

メソッド説明
ForEach<T>(T[] array, Action action)指定された配列内の各要素に対して,指定された処理を実行します.
T : 配列要素の型.
array : 要素に処理を適用する配列.
action : 配列の各要素に対して実行するAction<T>
varpieces=new[]{new[]{"香","桂","銀","金","玉","金","銀","桂","香"},new[]{" ","飛"," "," "," "," "," ","角"," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{" "," "," "," "," "," "," "," "," "},new[]{"歩","歩","歩","歩","歩","歩","歩","歩","歩"},new[]{" ","角"," "," "," "," "," ","飛"," "},new[]{"香","桂","銀","金","王","金","銀","桂","香"}};Array.ForEach(pieces,row=>Console.WriteLine(string.Join(string.Empty,row)));

実行結果

香桂銀金玉金銀桂香
 飛     角 
歩歩歩歩歩歩歩歩歩
         
         
         
歩歩歩歩歩歩歩歩歩
 角     飛 
香桂銀金王金銀桂香

参考


  1. 本稿では,System.Array由来の機能の内,主要なものについて取り扱う.また,System.Linqによる拡張メソッドについては別記事で纏めることにする. 

  2. シャローコピー[shallow copy=浅いコピー.簡易コピーとも呼ばれる] では,変数などのオブジェクトに入っている値をそのままコピー先に複製する.コピーするデータが値型の場合は特に問題はないが,参照型の場合は参照先アドレスの複製になるので,複製元オブジェクトと複製先オブジェクトが同じ場所を参照している状態になる.  


Viewing all articles
Browse latest Browse all 757

Trending Articles