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

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

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

하지만 둘 다 못 생겼어

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



답변

배열이 주어지면 다음 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();


답변

편집 : 배열로 변환

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

트릭을 수행해야합니다.

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


답변

의 예외를 피하기 위해 .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);


답변

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

var converted = arr.Select(int.Parse)


답변

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

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


답변

var list = arr.Select(i => Int32.Parse(i));


답변