문제의 정의
특정 어레이(array)가 있다고 가정하자. 이 어레이의 일부를 가져와서 사용하거나 다른 변수에 저장을 하고자 한다. 예를 들어 이 어레이의 데이터 중 인덱스 번호 3부터 7까지의 값을 다른 변수에 저장해야하는 경우 어떻게 해야할까?
방법
for loop을 사용하여 시작 인덱스부터 끝 인덱스까지 가져오는 방법이 일반적이다. C#의 Array 클래스가 가지고 있는 Copy() 메서드를 사용하면 조금 더 간결한 코드로 이를 수행할 수 있다. MS 문서의 Array.Copy 메서드 항목 중, Array.Copy(Array, Int64, Array, Int64, Int64)를 간단히 설명하고 사용해보고자 한다. 이 메서드는 다음과 같은 파라미터를 필요로 한다.
이 메서드를 사용하여 특정 어레이의 일부분을 가져와서 저장하고 이 값을 출력해보는 예시 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private static void _testCode()
{
// test code
int[] sourceArrInt = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int startIdx = 3;
int endIdx = 7;
int length = endIdx - startIdx + 1;
int[] targetArrInt = new int[length];
Array.Copy(sourceArrInt, startIdx, targetArrInt, 0, length);
foreach (var elm in targetArrInt)
{
Console.WriteLine(elm);
}
}
|
cs |
이를 응용하여 특정 어레이와 이 어레이에서 복사하고자 하는 부분의 시작 인덱스와 끝 인덱스를 파라미터로 받아서 반영하는 제네릭(generic) 메서드를 만들어보았다.
먼저 이 함수를 Utils 클래스를 만들고 그 클래스 안에 정적(static) 메서드 SubArray를 정의하였다. 이 메서드는 특정 어레이, 이 어레이에서 복사하고자 하는 부분의 시작 인덱스와 끝 인덱스를 받아서 특정 어레이와 같은 형식으로 부분 어레이를 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace test
{
public static class Utils
{
public static T[] SubArray<T>(this T[] data, int startIdx, int endIdx)
{
int length = endIdx - startIdx + 1;
T[] result = new T[length];
Array.Copy(data, startIdx, result, 0, length);
return result;
}
}
}
|
cs |
그리고 이 Utils 클래스의 정적 메서드인 SubArray를 사용하여 특정 어레이의 일부분을 가져와서 출력해보는 예시 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private static void _testCodeWithFunc()
{
// test with func.
int[] sourceArrInt = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int startIdx = 3;
int endIdx = 7;
int[] targetArrInt = Utils.SubArray(sourceArrInt, startIdx, endIdx);
foreach (var elm in targetArrInt)
{
Console.WriteLine(elm);
}
}
|
cs |
Reference
- stackoverflow.com/questions/943635/how-do-i-clone-a-range-of-array-elements-to-a-new-array
- docs.microsoft.com/ko-kr/dotnet/api/system.array.copy?view=net-5.0
- github.com/daegukdo/TIL/tree/master/02_C_sharp/017_SubArrayInArr
'Study > C#' 카테고리의 다른 글
이벤트 호출 시 null 확인 코드의 중요성 (0) | 2021.02.08 |
---|---|
C# WPF에서 MVC 디자인 패턴 연습 예제 구현하기 (0) | 2021.01.25 |
구분자(delimiter)가 같은 문자열(string) 데이터를 특정 타입(type)의 어레이(array)로 변환하기 (0) | 2021.01.21 |
C# WPF에서 user control과 data binding에 대한 간단한 설명 (0) | 2021.01.17 |
Third-party library 사용에 있어서 visual studio와 C# version 그리고 .NET framework 확인의 중요성 (0) | 2020.02.20 |