HOWTO · Csharp
C#에서 문자열 배열을 Int 배열로 변환
이 가이드에서는 C#에서 string형 배열을 int 배열로 변환하는 방법을 배웁니다.
이 페이지의 내용
이 가이드에서는 C#에서 string 배열을 int 배열로 변환하는 방법을 보여 줍니다. 모든 요소가 텍스트로 전달되므로 각 값을 정수로 구문 분석해야 합니다. 이 작업을 다루는 패턴은 세 가지입니다: Array.ConvertAll, int.Parse를 사용한 LINQ Select 프로젝션, 그리고 깔끔하게 구문 분석되지 않을 수 있는 입력을 위해 int.TryParse를 사용하는 동일한 프로젝션입니다.
Array.ConvertAll로 문자열 배열 변환
Array.ConvertAll는 소스 배열의 모든 요소에 변환기 함수를 적용하고 대상 형식의 새 배열을 반환합니다. 변환기로 int.Parse 메서드 그룹을 전달하면 한 문장으로 각 문자열을 구문 분석할 수 있습니다.
다음 예제를 실행해 보세요:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = Array.ConvertAll(temp_str, int.Parse);
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
결과는 새 int[]이며 원래 string[]은 그대로 유지됩니다. 모든 요소를 같은 방식으로 변환하고 추가 프로젝션이 필요하지 않을 때 Array.ConvertAll는 좋은 기본 선택입니다. int.Parse가 변환을 수행하므로 모든 요소는 Int32 범위 안의 올바른 형식의 정수여야 하며, 다음 섹션에서 설명하는 구문 분석 규칙이 여기에도 적용됩니다.
LINQ Select와 int.Parse로 문자열 배열 변환
LINQ의 Select 메서드는 소스 시퀀스의 각 요소를 함수를 통해 프로젝션합니다. Select(int.Parse)는 배열이 아닌 IEnumerable<int>를 생성하므로 결과를 int[]로 구체화하려면 ToArray가 필요합니다. 이 형태는 값을 구문 분석하기 전에 필터링하는 것처럼 변환이 더 긴 LINQ 파이프라인의 일부일 때 자연스럽게 어울립니다.
다음 예제를 실행해 보세요:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "2000", "3000" };
int[] temp_int = temp_str.Select(int.Parse).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
2000
3000
Select는 지연 실행된다는 점에 유의하세요. 시퀀스를 열거하기 전까지는 아무 값도 구문 분석되지 않으며, ToArray가 그 열거를 정확히 한 번 수행합니다. int.Parse는 엄격합니다. 값이 숫자가 아니면 FormatException을, Int32 범위를 벗어나면 OverflowException을 발생시킵니다. 위의 두 패턴은 모두 이 동작을 공유하며, 세 번째 접근 방식이 바로 이 문제를 다룹니다.
int.TryParse로 잘못된 값 처리
int.TryParse는 예외를 발생시키는 대신 bool을 반환하므로 구문 분석할 수 없는 값을 허용하며, 람다가 result로 노출하는 out 매개 변수에 구문 분석된 숫자를 기록합니다. Select 내부에서 람다는 성공하면 구문 분석된 값을, 실패하면 선택한 대체 값을 반환합니다. 아래 프로그램은 구문 분석에 실패한 모든 값을 0으로 대체합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
using System.Linq;
class Program {
static void Main() {
string[] temp_str = new string[] { "1000", "abc", "3000" };
int[] temp_int = temp_str.Select(s => int.TryParse(s, out int result) ? result : 0).ToArray();
foreach (int num in temp_int) {
Console.WriteLine(num);
}
}
}
1000
0
3000
대체 값은 신중하게 선택하세요. 대체된 0은 결과에서 실제 0과 구별할 수 없습니다. 이러한 모호성을 허용할 수 없다면 실패를 별도로 기록하세요. 구문 분석되지 않은 값을 필터링하거나 -1 같은 센티넬 값을 사용하거나, 문제가 있는 문자열을 수집해 로깅할 수 있습니다.
패턴을 빠르게 선택하려면 한 번의 호출로 끝나는 직접 변환만 필요할 때는 Array.ConvertAll를, 변환이 LINQ 파이프라인 안에 있을 때는 int.Parse와 함께 Select를, 입력을 신뢰할 수 없고 문서화된 대체 값을 사용할 수 있을 때는 int.TryParse를 사용하세요.