C # Эквивалент для карты Python ()? [Дубликат]

1

Обычно в Python 2/3 мы можем использовать следующий код для разделения двух целых чисел, разделенных пробелами на две переменные:

a,b = map(int,input().split())

Есть ли короткий эквивалент С#? (т.е. ничего, как показано ниже)

string[] template = Console.ReadLine().Split();
a = Convert.ToInt32(template[0]);
b = Convert.ToInt32(template[1]);
  • 0
    Добавьте пробел в разделить Split(' ') , чтобы определить символ разделения. И C # не был предназначен для разделения значений таким образом, но теперь это возможно, но я бы воздержался от этого «упрощения»
  • 0
    Если у вас есть длинная версия, то вы всегда можете обернуть ее по своему усмотрению.
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Вы можете попробовать следующее:

var result = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();

Тем не менее, приведенный выше код будет вылетать, если вход не действует.

Более отказоустойчивый подход будет следующим:

var result = Console.ReadLine()
                    .Split(' ')
                    .Select(input => 
                    {
                        int? output = null;
                        if(int.TryParse(input, out var parsed))
                        {
                            output = parsed;
                        }
                        return output;
                    })
                    .Where(x => x != null)
                    .Select(x=>x.Value)
                    .ToArray();
  • 0
    Вы могли бы упростить вашу лямбду до s => int.TryParse(s, out var i) ? i : default
  • 1
    @ Emaro Я не придерживался этого подхода, поскольку предположил, что при сбое синтаксического анализа пользователь не предоставил правильное целое число. Таким образом, для входа 3 4 ab 10, я ожидаю, что результатом будет массив из трех элементов 3,4 и 10, а не пяти 3,4,0,0 и 10. Я думаю, что этот подход имеет смысл, потому что разные входы должен иметь разные выходы и не одинаковые. Например, для входа 3 4 0 0 10 результат будет таким же, как и для входа 3 4 ab 10.
Показать ещё 2 комментария
1

Он называется Select(). Вам нужно импортировать Linq:

using System.Linq;

Затем вы можете использовать его подобно карте. Имейте в виду, что это функция расширения и не является точным эквивалентом.

var integers = Console.ReadLine().Split().Select(s => Convert.ToInt32(s)).ToArray();
var a = integers[0];
var b = integers[1];

В этом примере отсутствует правильная обработка ошибок.


редактировать

  • Добавить ToArray()
  • Запишите lambda, что необходимо из-за перегрузок Convert.ToInt32

Ещё вопросы

Сообщество Overcoder
Наверх
Меню