2009-08-19 11 views
195

Mam tablicę liczb całkowitych w postaci wyrażenie:Konwersja string [] int [] w jednej linii kodu przy użyciu LINQ

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

muszę tablicę liczb całkowitych „prawdziwych”, aby go popchnąć dalej:

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

próbowałem rzucać int i to oczywiście nie powiodło się:

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

mogę zrobić dalej:

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

lub

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

ale oba wygląda brzydko.

Czy istnieją inne sposoby wykonania tego zadania?

+3

Co jest nie tak z prostą iteracją w jednej kolekcji, konwersją wartości i dodaniem jej do drugiej? Wydaje mi się to całkiem jasne w intencji. –

+1

W przeciwnym razie http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx –

+1

Zgadnij, że powinienem opublikować odpowiedź, ponieważ taka była zaakceptowana sugestia :-) –

Odpowiedz

453

Biorąc pod uwagę Tablica można użyć Array.ConvertAll method:

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

Dzięki Marc Gravell za wskazanie, że lambda mogą zostać pominięte, otrzymując krótsza wersja poniżej:

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

Rozwiązanie LINQ jest podobna, z wyjątkiem ciebie potrzebowałby dodatkowej ToArray wezwanie, aby uzyskać tablicę:

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

Nice. Nie wiedziałem tego. +1 – spender

+0

+1 za najmniejszy ślad, mimo że LINQ jest pytany – Marc

+0

Bardziej przyjazny dla czytelnika +1 – Havenard

24

EDIT: przekonwertować do tablicy

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

To powinno załatwić sprawę:

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

.ToArray() wymagane do spełnienia pytania OP – spender

+1

zmienić var ​​na int [] i dołączyć .ToArray(), jeśli potrzebujesz go jako tablicę int –

2
var list = arr.Select(i => Int32.Parse(i)); 
3
var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

mieć pewność, że nie jesteś coraz IEnumerable<int> jako powrót

11

można po prostu rzucać tablicę ciągów int tablicę według:

var converted = arr.Select(int.Parse) 
+4

fajny! Dziękuję Ci. A w VB.Net 'Dim convert = arr.Select (addressof Integer.Parse)' –

12

Aby uniknąć wyjątków przy pomocy .Parse, oto niektóre alternatywy .TryParse.

aby stosować tylko te elementy, które mogą być przeanalizowane:

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 } 

lub

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

alternatywne, stosując 0 dla elementów, które nie mogą być analizowane:

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

lub

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

Dzięki za to rozwiązanie! – AngieM

+0

Drugie rozwiązanie: 'var a = Enumerable.Range (0, arr.Length) .Where (i => int.TryParse (arr [i], out i)) ToArray();' po prostu zwraca wartości zerowe 0, 1,2, ... zamiast rzeczywistych wartości. Jakie jest właściwe rozwiązanie? – Beetee

+0

Dzięki @Beetee. Nie jestem pewien, co o tym myślałem. Zastąpiłem go inną alternatywą. – Slai

Powiązane problemy