수색…
통사론
배열 선언하기 :
<type> [] <name>;
2 차원 배열 선언 :
<type> [,] <이름> = 새 <유형> [<값>, <값>];
들쭉날쭉 한 배열 선언 :
<type> [] <이름> = 새 <유형> [<값>];
지그재그 배열에 대한 하위 배열 선언 :
<이름> [<값>] = 새 <유형> [<값>];
값없이 배열 초기화하기 :
<이름> = 새 <유형> [<길이>];
값으로 배열 초기화하기 :
<이름> = 새 <유형> [] {<값>, <값>, <값>, ...};
값으로 2 차원 배열 초기화하기 :
<name> = 새로운 <type> [,] {{<value>, <value>}, {<value>, <value>}, ...};
인덱스 i의 요소에 액세스 :
<이름> [i]
배열 길이 가져 오기 :
<이름>. 길이
비고
C #에서는 배열이 참조 형식이므로 nullable 을 의미합니다.
배열은 캔트 수단 고정 길이 갖는다 .Add()
그 이상으로 .Remove()
그것을 행합니다. 이를 사용하려면 List
또는 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부터 시작합니다. 위 배열의 인덱스는 0-9입니다. 예 :
int[] arr = new int[3] {7,9,4};
Console.WriteLine(arr[0]); //outputs 7
Console.WriteLine(arr[1]); //outputs 9
즉, 시스템은 요소 인덱스를 0부터 계산하기 시작합니다. 또한 배열 요소에 대한 액세스는 일정 시간 내에 수행됩니다. 즉, 배열의 첫 번째 요소에 액세스하는 것은 두 번째 요소, 세 번째 요소 등을 액세스하는 것과 동일한 비용 (시간상)을 갖는다는 것을 의미합니다.
또한 배열을 인스턴스화하지 않고 배열에 대한 참조를 선언 할 수도 있습니다.
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
삼
삼
9
다차원 배열
배열에는 둘 이상의 차원이있을 수 있습니다. 다음 예제에서는 10 개의 행과 10 개의 열로 구성된 2 차원 배열을 만듭니다.
int[,] arr = new int[10, 10];
세 가지 차원의 배열 :
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][];
두 번째 []
는 숫자없이 초기화됩니다. 하위 배열을 초기화하려면 별도로 수행해야합니다.
for (int i = 0; i < a.length; i++)
{
a[i] = new int[10];
}
값 가져 오기 / 설정
이제 하위 배열 중 하나를 얻는 것이 쉽습니다. a
의 세 번째 열의 모든 숫자를 인쇄 해 봅시다.
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;
}
}
/// Sample
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
배열의 각 요소가있는 10 개의 정수 배열이 만들어집니다 ( int
유형의 기본값).
기본값이 아닌 값으로 초기화 된 배열을 만들려면 System.Linq
네임 스페이스의 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();
배열 복사
소스 Array와 Array.Copy()
인덱스 0에서 시작하는 정적 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
모두 얕은 복사를 수행합니다. 즉, 내용에 원래 배열의 요소와 동일한 객체에 대한 참조가 포함되어 있음을 의미합니다.
일련 번호 배열 만들기
LINQ는 순차 숫자로 채워진 컬렉션을 쉽게 만들 수있는 메서드를 제공합니다. 예를 들어 1에서 100 사이의 정수를 포함하는 배열을 선언 할 수 있습니다.
Enumerable.Range
메서드를 사용하면 지정된 시작 위치와 여러 요소에서 정수 값 시퀀스를 만들 수 있습니다.
이 메소드는 시작 값과 생성 할 요소의 수라는 두 개의 인수를 취합니다.
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]
에서 시작하는 10 개의 정수 제곱을 포함하는 배열을 생성합니다.
배열이 동일한 지 비교하기
LINQ는 두 개의 IEnumerable
이 같은지 검사 할 수있는 기본 제공 함수를 제공 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
List<int>
에는 값 3, 5 및 7을 포함하는 List<int>
포함됩니다.
IEnumerable<>
지원은 LINQ를 사용하여 배열을 쿼리 할 수 있음을 의미합니다 arr1.Select(i => 10 * i)
예 : arr1.Select(i => 10 * i)
.