サーチ…
構文
配列の宣言:
<タイプ> [] <名前>;
2次元配列の宣言:
<タイプ> [、] <名前> =新しい<タイプ> [<値>、<値>];
ジグザグ配列の宣言:
<タイプ> [] <名前> =新しい<タイプ> [<値>];
Jagged Arrayのサブアレイを宣言する:
<name> [<value>] =新しい<type> [<value>];
値のない配列の初期化:
<name> =新しい<type> [<length>];
配列を値で初期化する:
<name> =新しい<type> [] {<value>、<value>、<value>、...};
値を持つ2次元配列を初期化する:
<name> = new <type> [、] {{<value>、<value>}、{<value>、<value>}、...};
インデックスiの要素へのアクセス:
<名前> [i]
配列の長さを取得する:
<名前> .Length
備考
C#では、配列は参照型です。つまり、 null型です。
配列は、あなたがカントを意味し、固定長である.Add()
、それ以上に.Remove()
それから。これらを使用するには、動的配列Array( List
またはArrayList
が必要ArrayList
。
配列の共分散
string[] strings = new[] {"foo", "bar"};
object[] objects = strings; // implicit conversion from string[] to object[]
この変換は型セーフではありません。次のコードは、ランタイム例外を発生させます。
string[] strings = new[] {"Foo"};
object[] objects = strings;
objects[0] = new object(); // runtime exception, object is not string
string str = strings[0]; // would have been bad if above assignment had succeeded
配列値の取得と設定
int[] arr = new int[] { 0, 10, 20, 30};
// Get
Console.WriteLine(arr[2]); // 20
// Set
arr[2] = 100;
// Get the updated value
Console.WriteLine(arr[2]); // 100
配列の宣言
角括弧( []
)初期化構文を使用して、配列を宣言してデフォルト値で埋めることができます。たとえば、10個の整数の配列を作成するとします。
int[] arr = new int[10];
C#のインデックスはゼロベースです。上記の配列のインデックスは0〜9です。例えば:
int[] arr = new int[3] {7,9,4};
Console.WriteLine(arr[0]); //outputs 7
Console.WriteLine(arr[1]); //outputs 9
つまり、システムは要素インデックスを0から数え始めます。さらに、配列の要素へのアクセスは一定の時間内に行われます。つまり、配列の最初の要素へのアクセスには、2番目の要素、3番目の要素などをアクセスするのと同じコストがかかります。
また、配列をインスタンス化せずに配列への裸の参照を宣言することもできます。
int[] arr = null; // OK, declares a null reference to an array.
int first = arr[0]; // Throws System.NullReferenceException because there is no actual array.
配列は、コレクション初期化構文を使用してカスタム値を使用して作成および初期化することもできます。
int[] arr = new int[] { 24, 2, 13, 47, 45 };
new int[]
部分は、配列変数を宣言するときに省略することができます。これは自己完結型の式ではないため、別の呼び出しの一部として使用すると機能しません(そのために、 new
バージョンを使用してください)。
int[] arr = { 24, 2, 13, 47, 45 }; // OK
int[] arr1;
arr1 = { 24, 2, 13, 47, 45 }; // Won't compile
暗黙的に型指定された配列
あるいは、 var
キーワードと組み合わせて、特定の型を省略して、配列の型を推定することもできます。
// same as int[]
var arr = new [] { 1, 2, 3 };
// same as string[]
var arr = new [] { "one", "two", "three" };
// same as double[]
var arr = new [] { 1.0, 2.0, 3.0 };
配列を反復する
int[] arr = new int[] {1, 6, 3, 3, 9};
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
foreachを使って:
foreach (int element in arr)
{
Console.WriteLine(element);
}
ポインタで安全でないアクセスを使用するhttps://msdn.microsoft.com/en-ca/library/y31yhkeb.aspx
unsafe
{
int length = arr.Length;
fixed (int* p = arr)
{
int* pInt = p;
while (length-- > 0)
{
Console.WriteLine(*pInt);
pInt++;// move pointer to next element
}
}
}
出力:
1
6
3
3
9
多次元配列
配列は複数の次元を持つことができます。次の例では、10行10列の2次元配列を作成します。
int[,] arr = new int[10, 10];
3つの次元の配列:
int[,,] arr = new int[10, 10, 10];
宣言時に配列を初期化することもできます:
int[,] arr = new int[4, 2] { {1, 1}, {2, 2}, {3, 3}, {4, 4} };
// Access a member of the multi-dimensional array:
Console.Out.WriteLine(arr[3, 1]); // 4
ジグザグ配列
ジグザグ配列は、プリミティブ型の代わりに配列(または他のコレクション)を含む配列です。配列の配列のようなものです。各配列要素には別の配列が含まれています。
それらは多次元配列に似ていますが、多次元配列は固定数の行と列に限定され、ギザギザ配列ではすべての行が異なる数の列を持つことができるため、わずかな違いがあります。
ギザギザの配列を宣言する
たとえば、8列のギザギザの配列を宣言すると次のようになります。
int[][] a = new int[8][];
2番目の[]
は数値なしで初期化されます。サブアレイを初期化するには、個別に行う必要があります。
for (int i = 0; i < a.length; i++)
{
a[i] = new int[10];
}
値の取得/設定
今、サブアレイの1つを取得するのは簡単です。 a
3番目の列のすべての数字を印刷しましょう:
for (int i = 0; i < a[2].length; i++)
{
Console.WriteLine(a[2][i]);
}
特定の値を取得する:
a[<row_number>][<column_number>]
特定の値を設定する:
a[<row_number>][<column_number>] = <value>
注意 :常にギザギザの配列(配列の配列)ではなく多次元配列(マトリックス)を使用することをお勧めします。使用するのがより速くて安全です。
括弧の順序に関する注意
1次元のint
配列の5次元配列の3次元配列を考えてみましょう。これはC#で書かれています:
int[,,][,,,,][] arr = new int[8, 10, 12][,,,,][];
上記にように、CLR型システムでは、ブラケットの順序付けのための規則は、逆転されarr
インスタンス我々が持っています:
arr.GetType().ToString() == "System.Int32[][,,,,][,,]"
同様に:
typeof(int[,,][,,,,][]).ToString() == "System.Int32[][,,,,][,,]"
ある配列に別の配列が含まれているかどうかを確認する
public static class ArrayHelpers
{
public static bool Contains<T>(this T[] array, T[] candidate)
{
if (IsEmptyLocate(array, candidate))
return false;
if (candidate.Length > array.Length)
return false;
for (int a = 0; a <= array.Length - candidate.Length; a++)
{
if (array[a].Equals(candidate[0]))
{
int i = 0;
for (; i < candidate.Length; i++)
{
if (false == array[a + i].Equals(candidate[i]))
break;
}
if (i == candidate.Length)
return true;
}
}
return false;
}
static bool IsEmptyLocate<T>(T[] array, T[] candidate)
{
return array == null
|| candidate == null
|| array.Length == 0
|| candidate.Length == 0
|| candidate.Length > array.Length;
}
}
/// サンプル
byte[] EndOfStream = Encoding.ASCII.GetBytes("---3141592---");
byte[] FakeReceivedFromStream = Encoding.ASCII.GetBytes("Hello, world!!!---3141592---");
if (FakeReceivedFromStream.Contains(EndOfStream))
{
Console.WriteLine("Message received");
}
デフォルト以外の値を繰り返して配列を初期化する
わかっているように、デフォルト値を持つ配列を宣言できます:
int[] arr = new int[10];
これにより、配列の各要素が値0
( int
型のデフォルト値)を持つ10個の整数の配列が作成されます。
デフォルト以外の値で初期化された配列を作成するには、 System.Linq
名前空間のEnumerable.Repeat
を使用しEnumerable.Repeat
。
"true"で満たされたサイズ10の
bool
配列を作成するには、bool[] booleanArray = Enumerable.Repeat(true, 10).ToArray();
"100"で埋められたサイズ5の
int
配列を作成するには、int[] intArray = Enumerable.Repeat(100, 5).ToArray();
"C#"で満たされたサイズ5の
string
配列を作成するにはstring[] strArray = Enumerable.Repeat("C#", 5).ToArray();
配列のコピー
ソースと宛先の両方でインデックス0から始まる、静的なArray.Copy()
メソッドをArray.Copy()
した部分配列のコピー:
var sourceArray = new int[] { 11, 12, 3, 5, 2, 9, 28, 17 };
var destinationArray= new int[3];
Array.Copy(sourceArray, destinationArray, 3);
// destinationArray will have 11,12 and 3
ソースのインデックス0から開始し、コピー先の指定されたインデックスからCopyTo()
インスタンスメソッドを使用して配列全体をコピーする:
var sourceArray = new int[] { 11, 12, 7 };
var destinationArray = new int[6];
sourceArray.CopyTo(destinationArray, 2);
// destinationArray will have 0, 0, 11, 12, 7 and 0
Clone
を使用して配列オブジェクトのコピーを作成します。
var sourceArray = new int[] { 11, 12, 7 };
var destinationArray = (int)sourceArray.Clone();
//destinationArray will be created and will have 11,12,17.
CopyTo
とClone
どちらも、浅いコピーを実行しCopyTo
つまり、内容には元の配列の要素と同じオブジェクトへの参照が含まれています。
連続番号の配列を作成する
LINQは、連続した数字でいっぱいのコレクションを簡単に作成できる方法を提供します。たとえば、1〜100の整数を含む配列を宣言できます。
Enumerable.Range
メソッドを使用すると、指定された開始位置と複数の要素から整数のシーケンスを作成できEnumerable.Range
。
このメソッドは、開始値と生成する要素の数の2つの引数をとります。
Enumerable.Range(int start, int count)
count
は負であってはいけません。
使用法:
int[] sequence = Enumerable.Range(1, 100).ToArray();
これにより、1〜100の数値( [1, 2, 3, ..., 98, 99, 100]
)を含む配列が生成されます。
Range
メソッドはIEnumerable<int>
返すため、他のLINQメソッドを使用できます。
int[] squares = Enumerable.Range(2, 10).Select(x => x * x).ToArray();
これは、 4
: [4, 9, 16, ..., 100, 121]
4,9,16 [4, 9, 16, ..., 100, 121]
から始まる10の整数の正方形を含む配列を生成します。
配列の等価性の比較
LINQには、2つのIEnumerable
の等価性をチェックするための組み込み関数が用意されており、その関数を配列で使用できます。
SequenceEqual
機能が返されtrue
配列は同じ長さを有し、対応するインデックスの値が等しい、としている場合false
そうでありません。
int[] arr1 = { 3, 5, 7 };
int[] arr2 = { 3, 5, 7 };
bool result = arr1.SequenceEqual(arr2);
Console.WriteLine("Arrays equal? {0}", result);
これは印刷されます:
Arrays equal? True
配列をIEnumerable <>インスタンスとして
すべての配列は、非ジェネリックIList
インターフェイス(したがって非ジェネリックICollection
およびIEnumerable
ベースインターフェイス)を実装します。
さらに重要なのは、1次元配列は、その中に含まれるデータ型のIList<>
およびIReadOnlyList<>
ジェネリックインターフェイス(およびベースインターフェイス)を実装することです。つまり、それらを汎用の列挙型として扱い、最初に非配列形式に変換することなく、さまざまなメソッドに渡すことができます。
int[] arr1 = { 3, 5, 7 };
IEnumerable<int> enumerableIntegers = arr1; //Allowed because arrays implement IEnumerable<T>
List<int> listOfIntegers = new List<int>();
listOfIntegers.AddRange(arr1); //You can pass in a reference to an array to populate a List.
このコードを実行すると、リストlistOfIntegers
に値3,5、および7を含むList<int>
が含まれます。
IEnumerable<>
サポートは、配列がLINQで照会できることを意味します。たとえば、 arr1.Select(i => 10 * i)
です。