Study/C#

특정 어레이(array)의 일부분을 가져오거나 복사하기

13.d_dk 2021. 1. 19. 22:49
728x90
반응형

문제의 정의

 특정 어레이(array)가 있다고 가정하자. 이 어레이의 일부를 가져와서 사용하거나 다른 변수에 저장을 하고자 한다. 예를 들어 이 어레이의 데이터 중 인덱스 번호 3부터 7까지의 값을 다른 변수에 저장해야하는 경우 어떻게 해야할까?

 

방법

 for loop을 사용하여 시작 인덱스부터 끝 인덱스까지 가져오는 방법이 일반적이다. C#Array 클래스가 가지고 있는 Copy() 메서드를 사용하면 조금 더 간결한 코드로 이를 수행할 수 있다. MS 문서의 Array.Copy 메서드 항목 중, Array.Copy(Array, Int64, Array, Int64, Int64)를 간단히 설명하고 사용해보고자 한다. 이 메서드는 다음과 같은 파라미터를 필요로 한다.

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 = { 0123456789 };
    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 = { 0123456789 };
    int startIdx = 3;
    int endIdx = 7;
 
    int[] targetArrInt = Utils.SubArray(sourceArrInt, startIdx, endIdx);
 
    foreach (var elm in targetArrInt)
    {
        Console.WriteLine(elm);
    }
}
cs

 

 

Reference

  1. stackoverflow.com/questions/943635/how-do-i-clone-a-range-of-array-elements-to-a-new-array
  2. docs.microsoft.com/ko-kr/dotnet/api/system.array.copy?view=net-5.0 
  3. github.com/daegukdo/TIL/tree/master/02_C_sharp/017_SubArrayInArr
 

daegukdo/TIL

today I learned. Contribute to daegukdo/TIL development by creating an account on GitHub.

github.com

 

How do I clone a range of array elements to a new array?

I have an array X of 10 elements. I would like to create a new array containing all the elements from X that begin at index 3 and ends in index 7. Sure I can easily write a loop that will do it for...

stackoverflow.com

 

Array.Copy 메서드 (System)

한 Array의 요소 범위를 다른 Array에 복사하고 필요에 따라 형식 캐스팅 및 boxing을 수행합니다.Copies a range of elements in one Array to another Array and performs type casting and boxing as required.

docs.microsoft.com

 

반응형