Преобразуйте строку [] в int [] в одну строку кода, используя LINQ

У меня есть массив целых чисел в виде строки:

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

Мне нужно массивреальный» целые числа, чтобы подтолкнуть его дальше:

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

Я пытался привести int, и это, конечно, не удалось:

Foo(arr.Cast.ToArray());

Я могу сделать следующее:

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

или же

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

но оба выглядят некрасиво.

Есть ли другие способы выполнить задачу?

 Ed S.19 авг. 2009 г., 02:12
 Allen Rice19 авг. 2009 г., 02:49
Просто к вашему сведению, яЯ использую этот вопрос здесь:stackoverflow.com/questions/1297325/...
 Ed S.19 авг. 2009 г., 02:11
Какие'что плохого в том, чтобы просто перебрать одну коллекцию, преобразовать значение и добавить его во вторую? Кажется довольно ясно в намерении для меня.
 abatishchev09 июн. 2012 г., 21:00
@AhmadMageed: o_O Ой, действительно, извините. Я пересматривал свой ответ и сделал это по ошибке :)
 usr09 июн. 2012 г., 21:37
@abatishchev, да, но ты неВ вашем случае не может быть исключений. Если бы у вас были исключения, вы не могли быt преобразовал Parse в TryParse без изменения поведения. И при отсутствии исключений это не быстрее.
 Marc Gravell21 июн. 2010 г., 12:07
 Ahmad Mageed09 июн. 2012 г., 20:36
Мне немного любопытно, почему мой ответ не был принят через ~ 3 года. В любом случае я добавил решение LINQ, чтобы удовлетворить первоначальный вопрос, который был очень похож наConvertAll подход.
 usr09 июн. 2012 г., 20:34
TryParse не быстрее (за исключением случаев, когда ваши строки недействительны, но в этом случае выхочу исключение, чтобы предупредить вас.)

Ответы на вопрос(6)

var converted = arr.Select(int.Parse)
 Mafu Josh15 мар. 2013 г., 13:25
отлично! благодарю вас. И в VB.NetDim converted = arr.Select(addressof Integer.Parse)
var list = arr.Select(i => Int32.Parse(i));

РЕДАКТИРОВАТЬ: преобразовать в массив

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

Это должно сделать трюк:

var asIntegers = arr.Select(s => int.Parse(s));
 Simon Fox19 авг. 2009 г., 02:14
замените var на int [] и добавьте .ToArray (), если он вам нужен как массив int
 spender19 авг. 2009 г., 02:13
.ToArray () требуется для удовлетворения OP 'вопрос
var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

IEnumerable в качестве возврата

Решение Вопроса

Учитывая массив вы можете использовать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();
 Amr Alaa22 февр. 2019 г., 13:08
ты неt для проверки ошибок, не стоит полагать, что все строки хорошо отформатированы, даже если вы так думаете, многие вещи могут пойти не так, и вы получите исключение, что есть строка, которая не разбирается
 Slai03 мая 2016 г., 20:03
@BSalita Нет, в VB.Net этоArray.ConvertAll(arr, AddressOf Integer.Parse)
 BSalita15 янв. 2012 г., 16:24
Лямбда необходима в VB.Net 2010: uArray = Array.ConvertAll (sNums.Split (","), Функция (i) UInteger.Parse (i))
 Leniel Maccaferri14 февр. 2013 г., 21:21
Я сделал это, чтобы преобразоватьint[] массив кString массив:Array.ConvertAll(chaptersIds, Convert.ToString) Довольно мило! : D
 Allen Rice19 авг. 2009 г., 02:21
Генерируемый код IL на самом деле меньше, чем у Саймона Фокса.с ответом, FWIW
 Marc Gravell08 дек. 2010 г., 14:35
На самом деле, вы ненужна лямбда;ConvertAll(arr, int.Parse) достаточно
 spender19 авг. 2009 г., 02:17
Ницца. Didn»не знаю этого. +1
 Ahmad Mageed22 февр. 2019 г., 19:45
@AmrAlaa поздравляю, тыre первый downvoter :) Если серьезно, оригинальный вопрос показывает подход, использующий TryParse, поэтому, если кто-то хочет проверить на ошибки, которые 'Один вариант, с некоторыми недостатками. Я нене согласен с вами; проверка ошибок важна, но я чувствую, что ответ был достаточным для вопроса и не стал исчерпывающим о проверке ошибок. StackOverflow должен указывать вам на решение, но это неЭто означает, что он должен быть вставлен в наши проекты без размышлений и улучшений по мере необходимости.

.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);
 Beetee11 июл. 2017 г., 10:13
@Slai: Спасибо. Но что делаетnew int[0]? Когда у меня есть текст, я неполучить0 в моем массиве ...
 Slai11 июл. 2017 г., 13:12
@Beeteenew int[0] это пустой массив int. Первые два примера пропускают значения, которые могутбыть проанализирован, и последние два примера используют0 для значений, которые могутбыть разобранным
 Beetee10 июл. 2017 г., 13:20
Второе решение:var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray(); просто возвращает индексы 0,1,2, ... вместо реальных значений. Какие'правильное решение здесь?
 Slai10 июл. 2017 г., 14:14
Спасибо @Beetee. Не уверен, что я думал об этом. Я заменил его другой альтернативой.
 Beetee11 июл. 2017 г., 15:10
@Slai: А теперь я понял. Я перепуталnew int[] {0}, Спасибо.

Ваш ответ на вопрос