LINQ를 사용하여 한 줄의 코드에서 string []을 int []로 변환


273

문자열 형식의 정수 배열이 있습니다.

var arr = new string[] { "1", "2", "3", "4" };

더 나아가려면 '실제'정수 배열이 필요합니다.

void Foo(int[] arr) { .. }

나는 int를 캐스팅하려고 시도했지만 물론 실패했습니다.

Foo(arr.Cast<int>.ToArray());

다음에 할 수 있습니다 :

var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());

또는

var list = new List<int>(arr.Length);
arr.ForEach(i =>
{
   int j;
   if (Int32.TryParse(i, out j)) // TryParse is faster, yeah
   {
      list.Add(j);
   }
 }
 Foo(list.ToArray());

하지만 둘 다 못 생겼어

작업을 완료하는 다른 방법이 있습니까?


3
단순히 하나의 컬렉션을 반복하고 값을 변환하고 두 번째 컬렉션에 추가하면 무엇이 잘못됩니까? 나에게 의도가 분명한 것 같습니다.
Ed S.


1
그냥 참고로, 여기이 질문을 사용하고 있습니다 : stackoverflow.com/questions/1297325/...을
알렌 쌀


TryParse는 더 빠르지 않습니다 (문자열이 유효하지 않은 경우를 제외 하고 는 예외로 경고합니다).
usr

답변:


608

배열이 주어지면 다음 Array.ConvertAll방법을 사용할 수 있습니다 .

int[] myInts = Array.ConvertAll(arr, s => int.Parse(s));

람다를 생략 할 수 있다는 점을 지적 해 주신 Marc Gravell에게 감사드립니다.

int[] myInts = Array.ConvertAll(arr, int.Parse);

LINQ 솔루션은 비슷하지만 ToArray배열을 얻으려면 추가 호출 이 필요합니다 .

int[] myInts = arr.Select(int.Parse).ToArray();

4
좋은. 그거 몰랐어 +1
지출 자

이것이 생성하는 IL 코드는 실제로 Simon Fox의 대답 FWIW
Allen Rice

80
실제로 람다가 필요하지 않습니다. ConvertAll(arr, int.Parse)충분하다
Marc Gravell

1
Lambda는 VB.Net 2010에서 필요합니다. uArray = Array.ConvertAll (sNums.Split ( ","), Function (i) UInteger.Parse (i))
BSalita

1
@BSalita 아니오, VB.Net에서Array.ConvertAll(arr, AddressOf Integer.Parse)
Slai

31

편집 : 배열로 변환

int[] asIntegers = arr.Select(s => int.Parse(s)).ToArray();

트릭을 수행해야합니다.

var asIntegers = arr.Select(s => int.Parse(s));

1
충족 OP의 질문에 필요한 .ToArray ()
쓰셨

2
var를 int []로 변경하고 int 배열로 필요한 경우 .ToArray () 추가
Simon Fox

19

의 예외를 피하기 위해 .Parse다음과 같은 .TryParse대안이 있습니다.

구문 분석 할 수있는 요소 만 사용하려면 다음을 수행하십시오.

string[] arr = { null, " ", " 1 ", " 002 ", "3.0" };
int i = 0; 
var a = (from s in arr where int.TryParse(s, out i) select i).ToArray();  // a = { 1, 2 }

또는

var a = arr.SelectMany(s => int.TryParse(s, out i) ? new[] { i } : new int[0]).ToArray();

0구문 분석 할 수없는 요소를 사용 하는 대체 방법 :

int i; 
var a = Array.ConvertAll(arr, s => int.TryParse(s, out i) ? i : 0); //a = { 0, 0, 1, 2, 0 }

또는

var a = arr.Select((s, i) => int.TryParse(s, out i) ? i : 0).ToArray();

C # 7.0 :

var a = Array.ConvertAll(arr, s => int.TryParse(s, out var i) ? i : 0);

두 번째 해결책 : var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();실제 값 대신 0,1,2, ...을 반환합니다. 여기에 올바른 해결책은 무엇입니까?
Beetee

@Beetee에게 감사합니다. 내가 어떻게 생각하는지 모르겠습니다. 다른 대안으로 교체했습니다.
Slai

@Slai : 감사합니다. 그러나 무엇을 new int[0]하는가? 텍스트가있을 때 0배열에 들어 가지 않습니다 .
Beetee

@Beetee new int[0]는 빈 int 배열입니다. 처음 두 예제는 구문 분석 할 수없는 값을 건너 뛰고 마지막 두 예제는 0구문 분석 할 수없는 값에 사용 합니다.
Slai

@Slai : 아 이제 알겠다. 나는 그것을 섞었다 new int[] {0}. 고마워.
Beetee

12

다음과 같이 문자열 배열을 int 배열로 캐스팅 할 수 있습니다.

var converted = arr.Select(int.Parse)

5
좋은! 감사합니다. 그리고 VB.Net에서Dim converted = arr.Select(addressof Integer.Parse)
Mafu Josh

3
var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

당신이 IEnumerable<int>반환으로 하지 않는 확인해야합니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.