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

 

배열의 초기화

# 길이 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<int> listB = new List<int>(listA);

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

List<int> 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();

댓글

Designed by JB FACTORY