初めに
忘備録としてc#の配列操作についてまとめます。
とりあえずドキュメントに乗ってる配列操作すべてに触れてみました。
大体こちら↓を参考にしています。
https://docs.microsoft.com/ja-jp/dotnet/api/system.array?view=netframework-4.8
AsReadOnly
これは配列をreadOnlyにするもの
- 例
staticvoidMain(string[]args){string[]notReadOnlyArray=newstring[]{"first","second","third"};notReadOnlyArray[0]="first update";Console.WriteLine(string.Join(" , ",notReadOnlyArray));// first update , second , thirdvarreadOnlyArray=Array.AsReadOnly(notReadOnlyArray);readOnlyArray[1]="second update";// エラー発生Console.ReadKey();}
Array.AsReadOnlyメソッドで配列を作るとそのあと編集しようとしてもエラーが発生する。
BinarySearch
配列の中に検索したい値があるかの確認が出来る。
BinarySearchを実行する場合は配列をソートする必要がある。
該当結果がない場合は-1がかえって来る
該当するものがある場合はそのindexが返ってくる
検索ではindexOfも使える↓
https://docs.microsoft.com/ja-jp/dotnet/api/system.array.indexof?view=netframework-4.8
オバーロードに関してはこちら↓
https://docs.microsoft.com/ja-jp/dotnet/api/system.array.binarysearch?view=netframework-4.8
例
string[]stringValues=newstring[]{"ruby","go","c","c#"};objectseachValue="c";Array.Sort(stringValues);Console.WriteLine(string.Join(" , ",stringValues));// c , c# , go , rubyvarresult=Array.BinarySearch(stringValues,seachValue);Console.WriteLine(result);// 0Console.ReadKey();
Clear
配列の要素を削除したい場合に使う
すべて削除する場合ではなく部分で気に削除したい場合も使える。
消した部分はnullとして残る
配列を作りなおす場合はlistにしてnull部分を削除して配列を作りなおす?
例
staticvoidMain(string[]args){string[]stringValues=newstring[]{"first","second","want delete","third"};Array.Clear(stringValues,2,1);Console.WriteLine(string.Join(" , ",stringValues));// first , second , , thirdList<string>stringList=newList<string>(stringValues);stringList.Remove(null);string[]newStringValues=stringList.ToArray();Console.WriteLine(string.Join(" , ",newStringValues));// first , second , thirdConsole.ReadKey();}
Clone
配列はたしか参照型?だからほかの変数に代入しても
元の配列を変更したらそれを参照している変数すべてに影響が出ちゃう
Cloneを行えばそれを回避できる。
cloneをする前に(string[]) としてどのような形でcloneするのか指定する必要がある
例
staticvoidMain(string[]args){string[]stringValues=newstring[]{"first","second","third"};string[]newStringValues=stringValues;stringValues[0]="first update";Console.WriteLine(string.Join(" , ",newStringValues));// first update , second , third => stringValuesの変更が反映されてしまうstring[]stringValuesBeforeClone=newstring[]{"first","second","third"};string[]cloneStringValues=(string[])stringValuesBeforeClone.Clone();stringValuesBeforeClone[0]="first update";Console.WriteLine(string.Join(" , ",cloneStringValues));// first , second , third => stringValuesVeforeCloneの変更が反映されないConsole.ReadKey();}
ConstrainedCopy
配列からデータを持ってきて他の配列にデータをコピーする。
引数としては
(データを持ってくる配列,データを持ってくる配列の位置,コピーする対象の配列,コピーする配列の位置,コピーする長さ)
といった感じ
例
staticvoidMain(string[]args){string[]baseArray=newstring[]{"first","second","third"};string[]otherArray=newstring[]{"other","other","other"};Array.ConstrainedCopy(baseArray,0,otherArray,2,1);Console.WriteLine(string.Join(" , ",otherArray));// other , other , firstConsole.ReadKey();}
ConvertAll
配列の中身をすべてメソッドを実行して変換する
例
配列の中身をstringからintに変換
staticvoidMain(string[]args){string[]stringNumberArray=newstring[]{"1","2","3"};int[]intNumberArray=Array.ConvertAll<string,int>(stringNumberArray,delegate(stringstr){returnint.Parse(str);});Console.ReadKey();}
Copy
配列のコピーを行う
いまいちConstrainedCopyとの違いがわからない...
例
staticvoidMain(string[]args){string[]baseArray=newstring[]{"first","second","third"};string[]otherArray=newstring[]{"other","other","other"};Array.Copy(baseArray,0,otherArray,2,1);Console.WriteLine(string.Join(" , ",otherArray));// other , other , firstConsole.ReadKey();}
copy
配列の中身を他の配列にコピーします。
引数にコピー先とコピーの開始位置を設定します。
例
staticvoidMain(string[]args){string[]sourceArray=newstring[]{"first","second","third"};string[]targetArray=newstring[]{"other","other","other","other",null,null,null,null};sourceArray.CopyTo(targetArray,4);Console.WriteLine(string.Join(" , ",targetArray));// other , other , other , other , first , second , third ,Console.ReadKey();}
CreateInstance
配列の作成を行う
SetValueで値の設定
GetValueで値の取得が出来る。
例
staticvoidMain(string[]args){string[]sourceArray=(string[])Array.CreateInstance(typeof(String),10);sourceArray.SetValue("go",0);sourceArray.SetValue("ruby",1);sourceArray.SetValue("c#",2);Console.WriteLine(string.Join(" , ",sourceArray));// go , ruby , c# , , , , , , ,Console.ReadKey();}
Empty
からの配列を返します。
例
staticvoidMain(string[]args){string[]sourceArray=newstring[]{"go","ruby","c#"};Console.WriteLine(string.Join(" , ",sourceArray));// go , ruby , c#sourceArray=Array.Empty<string>();Console.WriteLine(sourceArray.Count());// 0Console.WriteLine(string.Join(" , ",sourceArray));// Console.ReadKey();}
Exists
配列の中に特定の条件のもがあるか確認する。
例
staticvoidMain(string[]args){string[]sourceArray=newstring[]{"go","ruby","c#"};boolresult=Array.Exists(sourceArray,element=>element.StartsWith("c"));Console.WriteLine(result);// TrueConsole.ReadKey();}
Find
要素の中で条件に一致するものの中で一番インデックス番号が小さい値を返す。
インデックス番号を返すわけではない
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000};intresult=Array.Find(targetArray,e=>e>=100);Console.WriteLine(result.ToString());// 100Console.ReadKey();}
FindAll
要素の中で条件に一致するものすべてを取得する。
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000};int[]result=Array.FindAll(targetArray,e=>e>=100);Console.WriteLine(string.Join(" , ",result));// 100 , 1000Console.ReadKey();}
FindIndex
要素の中で条件に一致する要素の一番小さいindexを返す
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000};intresult=Array.FindIndex(targetArray,e=>e>=100);Console.WriteLine(result.ToString());// 2Console.ReadKey();}
FindLast
要素の中で条件に一致する要素の中で一番index番号が大きい要素を返す。
indexを返すわけではない。
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000,10000};intresult=Array.FindLast(targetArray,e=>e>=100);Console.WriteLine(result.ToString());// 10000Console.ReadKey();}
FindLastIndex
要素の中で条件に一致する要素の中で一番おおきいindexを返す。
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000,10000};intresult=Array.FindLastIndex(targetArray,e=>e>=100);Console.WriteLine(result.ToString());// 4Console.ReadKey();}
foreach
配列のそれぞれの要素に対して処理を行う
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,10,100,1000,10000};foreach(variintargetArray){Console.WriteLine(i.ToString());}// 1// 10// 100// 1000// 10000Console.ReadKey();}
GetLength
多次元配列の場合に特定の次元の配列の数を返す
例
staticvoidMain(string[]args){int[,]targetArray={{0,0,0,0},{0,0,0,0}};intoneDimentionalCount=targetArray.GetLength(0);Console.WriteLine(oneDimentionalCount);// 2inttwoDimentionalCount=targetArray.GetLength(1);Console.WriteLine(twoDimentionalCount);// 4Console.ReadKey();}
GetLowerBound
いまいち使い方がわからないけど
指定した次元の最初のindexを取得する
例
staticvoidMain(string[]args){int[]numberArray=newint[]{0,1,2,3,4,5};intlowerBound=numberArray.GetLowerBound(0);Console.WriteLine(lowerBound);// 0Console.ReadKey();}
GetUpperBound
指定した次元の最後のindexを取得する。
例
staticvoidMain(string[]args){int[]numberArray=newint[]{0,1,2,3,4,5};intupperBound=numberArray.GetUpperBound(0);Console.WriteLine(upperBound);// 5Console.ReadKey();}
IndexOf
配列内の要素にて一致するものがあればその最初のindexを返す
例
staticvoidMain(string[]args){string[]targetArray=newstring[]{"A","B","C","Z","D","Z"};intresult=Array.IndexOf(targetArray,"Z");Console.WriteLine(result);// 3Console.ReadKey();}
LastIndexOf
配列内の要素にて一致するものがあればその最後のindexを返す
例
staticvoidMain(string[]args){string[]targetArray=newstring[]{"A","B","C","Z","D","Z"};intresult=Array.LastIndexOf(targetArray,"Z");Console.WriteLine(result);// 5Console.ReadKey();}
Resize
配列の長さを変える
例
staticvoidMain(string[]args){string[]sourceArray=newstring[]{"go","ruby","c","c++"};Console.WriteLine(sourceArray.Length);// 4Array.Resize(refsourceArray,6);Console.WriteLine(sourceArray.Length);// 6Console.WriteLine(string.Join(" , ",sourceArray));// go , ruby , c , c++ , ,Console.ReadKey();}
Reverse
配列を反転
引数に配列のみを渡すと全体を反転させる
三つ引数を渡す場合は
(配列、反転の開始位置、反転を行う要素の数)
を設定して部分的に反転させられる。
例
staticvoidMain(string[]args){int[]targetArray=newint[]{1,2,3,4,5,6,7,8,9,10};Array.Reverse(targetArray,4,3);Console.WriteLine(string.Join(" , ",targetArray));// 1 , 2 , 3 , 4 , 7 , 6 , 5 , 8 , 9 , 10Array.Reverse(targetArray);Console.WriteLine(string.Join(" , ",targetArray));// 10 , 9 , 8 , 5 , 6 , 7 , 4 , 3 , 2 , 1Console.ReadKey();}
Sort
配列をソートできる。
配列のみを渡すとそれっぽくソートしてくれる
独自にソートのルールを作ることが出来て、その場合は引数を三つ渡す。
比較する関数はICompareを継承して関数を作る。
例
独自のルールで配列をソートする場合
publicclassstringLengthCompare:IComparer{// Call CaseInsensitiveComparer.Compare with the parameters reversed.publicintCompare(Objectx,Objecty){if(x.ToString().Length<y.ToString().Length){return-1;}elseif(x.ToString().Length>y.ToString().Length){return1;}else{return0;}}}classProgram{staticvoidMain(string[]args){IComparerstringComparer=newstringLengthCompare();string[]targetArray=newstring[]{"aaa","aaaaaa","aa","aaaaaaaaa","aaaaa"};Array.Sort(targetArray,0,5,stringComparer);Console.WriteLine(string.Join(" , ",targetArray));// aa , aaa , aaaaa , aaaaaa , aaaaaaaaaConsole.ReadKey();}}
配列をそのままソートする場合
配列の中身が数字であれば小さい順にソートされる。
staticvoidMain(string[]args){int[]targetArray=newint[]{1,4,2,5,7,6,8,0};Array.Sort(targetArray);Console.WriteLine(string.Join(" , ",targetArray));// 0 , 1 , 2 , 4 , 5 , 6 , 7 , 8Console.ReadKey();}
TrueForAll
配列ないのすべての要素が条件に一致するか調べる。
例
staticvoidMain(string[]args){int[]targetArray=newint[]{2,4,6,8,10,12,14};boolresult=Array.TrueForAll(targetArray,e=>e%2==0);Console.WriteLine(result);// TrueConsole.ReadKey();}