🌍 C# Study/C# 케이스 스터디

배열Array 초기화 / 리스트List 초기화 / 배열의 복사 / 리스트의 복사

맨텀 2019. 7. 7. 23:07

 

배열의 초기화

# 길이 20인 배열 초기화

int[] IntArray = new int[20];

 

리스트 초기화

# 길이 20인 리스트 초기화

List<int> IntList = new List<int>(new int[20]);
- 정석적인 방법은 for문을 돌려서 Add를 20번하는 것이다.
- 위 방법은 20짜리 길이의 배열을 하나 더 만들고 이를 생성용으로만 사용하는 방식이라 메모리를 낭비한다.
- 같은 값을 넣기 위해서는 어차피 for문을 이용해야 하니 초기값으로 만들경우에만 사용할 것.
- LINQ의 array.ToList();를 사용할 수도 있다.

 

# 요소로 초기화

List<int> testNums = new List<int>() { 7, 7, 7, 7 } ;

# LINQ를 활용하기

 - 값을 5로 채운 길이 10의 리스트 초기화 

List<int> myList = Enumerable.Repeat(5, 10).ToList();

 

 

배열의 복사

int[] Array2 = new int[4];
int[] Array = Array2.Clone() as int[];
Clone은 object로 형변환 되서 나오기 때문에 (int[]) 같이 해당 자료형으로 캐스팅 해서 사용해야 함.

 

 

리스트의 얕은 복사

항목들을 복사하지만, 내부에 속해있는 개별 객체들은 참조만 복사되기 때문에

개별 객체를 수정할 경우 복사해간 쪽에서도 같이 바뀐다. 단, 값타입은 따로 처리할 필요없이 언제나 깊은 복사가 이루어진다.

List<MyClass> listB = new List<MyClass>(listA);

Linq를 사용하는 경우에는 아래의 코드도 가능.

List<MyClass> listB = listA.ToList();

 

리스트의 깊은 복사

내부 참조의 깊은 복사. 내부에 참조가 있는 경우, 아래와 같이 내부의 참조까지 복사해야한다.

(deepCopy constructor는 별도로 만들어야 한다)

List<MyClass> listB = listA.Select(x => new MyClass(x)).ToList();
List<MyClass> listC = listA.ConvertAll(x => new MyClass(x));

ConvertAll을 사용하기도 한다.

 

배열 -> 리스트

public List<int> testList;
public int[] testArray;

testList = new List<int>(testArray);

 

리스트 -> 배열

public List<int> testList;
public int[] testArray;

testArray = testList.ToArray();

 

반복 데이터 채우기 (LINQ)

Linq의 Enumerable.Range(int32, int32)를 사용한다면 특정 구간의 숫자를 채우는 범위 컬렉션을 만들 수 있다!

주의할 점은 첫번째 인자 ~ 두번째 인사 사이를 정수로 채우는 것이 아니라

첫번째 인자를 시작으로 두번째 인자 횟수만큼 생성한다.

 Enumerable.Range(2, 3) 이라면 => 2, 3 이 아니라 2, 3, 4 가 나오는 것.

using System.Linq;

List<int> myList = Enumerable.Range(0, 10).ToList();
int[] myArray = Enumerable.Range(0, 10).ToArray();

 

연속 데이터 채우기 (LINQ)

같은 값으로 컬렉션을 채워야하는 경우도 존재한다.

이때 사용할 수 있는 것이 Enumerable.Repeat.

List<int> myList = Enumerable.Repeat(-1, 10).ToList();