Eu tenho uma matriz de números inteiros em forma de seqüência de caracteres:
var arr = new string[] { "1", "2", "3", "4" };
Eu preciso de uma matriz de números inteiros 'reais' para empurrar ainda mais:
void Foo(int[] arr) { .. }
Eu tentei lançar int e, é claro, falhou:
Foo(arr.Cast<int>.ToArray());
Eu posso fazer a seguir:
var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());
ou
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());
mas ambos parecem feios.
Existem outras maneiras de concluir a tarefa?
c#
.net
linq
extension-methods
abatishchev
fonte
fonte
Respostas:
Dada uma matriz, você pode usar o
Array.ConvertAll
método :Agradecemos a Marc Gravell por apontar que o lambda pode ser omitido, produzindo uma versão mais curta mostrada abaixo:
Uma solução LINQ é semelhante, exceto que você precisaria de uma
ToArray
chamada extra para obter uma matriz:fonte
ConvertAll(arr, int.Parse)
é suficienteArray.ConvertAll(arr, AddressOf Integer.Parse)
EDIT: para converter em array
Isso deve fazer o truque:
fonte
Para evitar exceções
.Parse
, aqui estão algumas.TryParse
alternativas.Para usar apenas os elementos que podem ser analisados:
ou
Alternativas usadas
0
para os elementos que não podem ser analisados:ou
C # 7.0 :
fonte
var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();
apenas retorna os indeces 0,1,2, ... em vez dos valores reais. Qual é a solução certa aqui?new int[0]
? Quando tenho de texto, eu não obter um0
em minha matriz ...new int[0]
é uma matriz int vazia. Os dois primeiros exemplos ignoram valores que não podem ser analisados e os dois últimos exemplos usam0
para valores que não podem ser analisados.new int[] {0}
. THX.você pode simplesmente converter uma matriz de strings em int array por:
fonte
Dim converted = arr.Select(addressof Integer.Parse)
Você precisa ter certeza de que não está recebendo
IEnumerable<int>
um retornofonte
fonte