Предположим, у меня есть строковый массив, и он может содержать некоторые данные, которые могут быть проанализированы в integer
.Блок байпаса else int.TryParse в Lambda Синтаксис
string[] strnums = { "2", "3", "hello", "5", "6", "8" };
Я пытаюсь преобразовать этот массив строк в целочисленный массив с помощью LINQ Select
метод, что-то вроде этого: -
int[] numbers = strnums.Select(x =>
{
int temp = 0;
return int.TryParse(x, out temp) ? temp : 0;
}).ToArray();
Output:
2,3, , 5,6,8 // Не хочу 0 здесь
Здесь, в блоке else int.TryParse
, мне пришлось указать значение по умолчанию (0), но мне это не нужно, поэтому я назвал свой вопрос «By-Pass» «Другая часть.
я тогда использовал этот запрос, и это работает нормально, значит, не вставляя ненужный ноль, если строка не анализируются: -
int[] numbers1 = strnums.Select(x =>
{
int temp = 0;
bool isParsed = int.TryParse(x, out temp);
return new { temp, isParsed };
})
.Where(x => x.isParsed)
.Select(x => x.temp)
.ToArray();
Но это, кажется, много кода, просто для того, чтобы не учитывать значение по умолчанию, я проектирую, фильтрую и снова проектирую. Правильно ли это?
Я думаю, что это имеет смысл вообще, так как Linq рассматривает между проецированием и фильтрацией как отдельные последовательные операции.Я склонен использовать для этого значение nullable int, но ваш пробег может отличаться. – dbc
Я не вижу проблем со вторым примером. Это имеет смысл и на самом деле явно описывает то, что вы хотите, вместо того, чтобы быть «умным». – Euphoric