LINUX.ORG.RU

[Решено] Прочитать Nullable<long> из строки

 


0

1

Как написать то же самое понятнее? Пояснил комментариями.

C#

long? catCode = null;
// Если строка val не пустая, 
if (!(String.IsNullOrWhiteSpace(val)))
{
    // распознаем в первых цифрах до пробела целое 64-битное число.
    // Если его там нет, записываем в catCode NULL. 
    // Если его удалось распознать, записываем его в catCode.
    if (!(Int64.TryParse(val.Split(" ")[0], out long cc)))
    {
        catCode = null;
    }
    else 
    {
        catCode = cc;
    }
}

★★★

Последнее исправление: damix9 (всего исправлений: 1)

long? catCode = null;
// Si la cadena val no está vacía, 
if (!(String.IsNullOrWhiteSpace(val)))
{
    // Reconocemos los primeros dígitos antes del espacio como un número entero de 64 bits.
     // Si no está ahí, escribe NULL en catCode.
     // Si podemos reconocerlo, escríbalo en catCode.
    if (!(Int64.TryParse(val.Split(" ")[0], out long cc)))
    {
        catCode = null;
    }
    else 
    {
        catCode = cc;
    }
}
t184256 ★★★★★
()

А что именно нужно пояснить? код в целом и без комментариев понятен, единственное что я бы оставил комментарий про распознавание в первых цифрах до пробела и ещё что за входные данные такие странные потому что не ясно почему именно так они парсятся. Ну и внешний if не имеет смысла, т.к. и без него будет работать так же. З.ы. ветка с присвоением null также не нужна, т.к. в начале функции переменная уже проинициализирована null-ом

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)

Да вроде всё и так понятно. Даже мне, который на C# не кодит.

CrX ★★★
()
Ответ на: комментарий от cobold

А что именно нужно пояснить?

Нужно сделать так, чтоб не пришлось пояснять. Чтобы код читаемым был. Или так сойдет?

Ну и внешний if не имеет смысла, т.к. и без него будет работать так же.

Как это? Если val == null, а я вызываю val.Split()?

long? catCode = null;
if (!(String.IsNullOrWhiteSpace(val)))
{
    // распознаем в первых цифрах до пробела целое 64-битное число.
    if (Int64.TryParse(val.Split(" ")[0], out long cc))
    {
        catCode = cc;
    }
}
damix9 ★★★
() автор топика

К сожалению нольпойнтерофобия создателей дотнета сильно загаживает подобные трансформации. Я давно не трогал дотнет, но сделал бы как-то так.


public static string LeftDigits(this string str)
{
    if (str == null) return null;
    if (!str.contains(" ") return null;
    string left = str.Split(" ")[0];
    if (! left.All(Char.IsDigit){
        return null;
    }
    return left;
}

//... 

string digits = LeftDigits(val);
long? catCode = digits != null ? Int64.Parse(digits) : null;

Но я не шарпей, может там чего адекватного подвезли. Ну и я бы весь парсинг отдельно в метод унёс.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)

Пояснил комментариями

Структурируй код так, чтобы не надо было комментировать. Я не умею в шарп, но в целом нужно сделать так

Это отдельная функция, например getValues

val.Split(" ")

Это тоже отдельная функция, например getFirst

[0]

Ну и это отдельная функция, например parseLongElseNull

Int64.TryParse

Итого должно получиться типа

catCode = parseLongElseNull(getFirst(getValues(val)))

Если этот твой long имеет какой-то конкретный смысл, например если это длина (чего-то), то вместо getFirst назови getWidth и т.п.

no-such-file ★★★★★
()

В современном C# для таких вещей надо спаны использовать.

public static long? ReadLong(string str)
{
	ReadOnlySpan<char> span = str.AsSpan();
	int spaceIndex = span.IndexOf(' ');
	ReadOnlySpan<char> slice = span.Slice(0, spaceIndex == -1 ? span.Length : spaceIndex);
	return long.TryParse(slice, out long number) ? number : null;
}
amm
()

ya-betmen, no-such-file, amm, но это же всё еще страшнее, чем было в начале.

В итоге сделал так.

long? catCode = null;
if (!(String.IsNullOrWhiteSpace(val)))
{
    // распознаем в первых цифрах до пробела целое 64-битное число.
    if (Int64.TryParse(val.Split(" ")[0], out long cc))
    {
        catCode = cc;
    }
}
damix9 ★★★
() автор топика
Ответ на: комментарий от no-such-file

А почему у вас тут одни токсики на форуме?

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

Для кода «страшнее» это не про длину а про понятность. А ты даже комент решил оставить в качестве социального дезодоранта.

ЗЫ. А за иф внутри ифа бесполезный можно руки по задницу отрывать.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 3)
Ответ на: комментарий от damix9

Сделай бенчмарки, потом скажешь, что страшно, а что нет.

amm
()
Ответ на: комментарий от amm

Внешний if() убрать

long? catCode = null;
// распознаем в первых цифрах до пробела целое 64-битное число.
if (Int64.TryParse(val?.Split(" ")?[0], out long cc))
{
        catCode = cc;
}
cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.