@solacerxt

Как присвоить переменным значения из одной строки C#?

Что, если есть всего 2 переменные, которым нужно присвоить значения через пробел из одной строки e.g. "2 5". Я знаю, что можно сделать так:
int[] nums = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
int a = nums[0];
int b = nums[1];

Но такой способ сжирает довольно много памяти, можно ли как-то его упростить?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
@vabka Куратор тега C#
Токсичный
У вас память тратится на:
1. Изначальную строку
2. Массив для строк после разделения
3. Производные строки
4. Делегат для select
5. Итератор внутри select
6. Аллокакция нового массива в ToArray

Если совсем время не жалко, то можно поработать с оригинальной строкой через Span<char> - тогда, в теории, можно написать код без аллокаций вообще.
Но лично я бы этим не заморачивался, если этот код не является горячим местом
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Qualiant
Если с консоли.

int var1 = 0, var2 = 0;

char inpsymbol;

StringBuilder inpstr = new StringBuilder(string.Empty);

inpsymbol = (char)Console.Read();

while (inpsymbol != '\r' & inpsymbol != '\n')
{
    if (char.IsWhiteSpace(inpsymbol))
    {
        if (!Int32.TryParse(inpstr.ToString(), out var1))
        {
            throw new ArgumentException("Входная строка имела некорректный формат");
        }

        inpstr = new StringBuilder(string.Empty);
    }
    else
    {
        inpstr.Append(inpsymbol);
    }

    inpsymbol = (char)Console.Read();
}

if (!Int32.TryParse(inpstr.ToString(), out var2))
{
    throw new ArgumentException("Входная строка имела некорректный формат");
}

Console.WriteLine(var1);
Console.WriteLine(var2);

Console.ReadKey();


Если строка приходит откуда-то ещё.

int var1 = 0, var2 = 0;

string srcstr = "13223 32321";

StringBuilder inpstr = new StringBuilder(string.Empty);

foreach (char t in srcstr)
{
    if (char.IsWhiteSpace(t))
    {
        if (!Int32.TryParse(inpstr.ToString(), out var1))
        {
            throw new ArgumentException("Входная строка имела некорректный формат");
        }

        inpstr = new StringBuilder(string.Empty);
    }
    else
    {
        inpstr.Append(t);
    }
}

if (!Int32.TryParse(inpstr.ToString(), out var2))
{
    throw new ArgumentException("Входная строка имела некорректный формат");
}

Console.WriteLine(var1);
Console.WriteLine(var2);

Console.ReadKey();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ЭЛКОМ+ Москва
от 70 000 до 165 000 ₽
от 3 500 до 4 000 $
deeplay Новосибирск
от 130 000 до 200 000 ₽
28 янв. 2021, в 04:36
5000 руб./в час
28 янв. 2021, в 03:43
2000 руб./за проект
28 янв. 2021, в 02:42
120000 руб./в час