[c#] Вопрос по Int32.Parse

Jekich

Есть строка вида
s = "8 буквыбуквы"
то есть сначало число, потом пробел, потом буквы.
Мне нужно выцепить число. Попробовала сделать
Int32.Parse( s )
Ругается на формат. Пробовала играться с NumberStyles, но не помогло.
Вопрос. Можно распарсить подобную строку используя только Int32.Parse или только Convert?
З.Ы. Решила с помощью split, но мне не очень нравится
Int32.Parse( sNumStops.Split( ' ' )[ 0 ] );

zorin29

Ну Int32.Parse задумано как парсинг всей строки в инт, так что все логично. Просто для твоей цели, действительно, лучше подходил бы Convert.

Jekich

Когда читала мануал по Int32.Parse, то думала, что можно в явном виде сказать, что у меня строка состоит из числа + какая-то ерунда, но ничего не получилось.
А как сделать с помощью Convert? Возможно, что я ошибаюсь, но насколько я помню, толи Convert вызывает Int32.Parse, толи наоборот.

Dasar

правильное решение split + int.parse или regex + int.parse

Jekich

Ок, раз знатоки говорят, что это правильное решение, то так и оставлю.
Спасибо :D
Изначально казалось, что я просто не дочитала мануал по Int32.Parse.

val63

Божмой, ну Int32.Parse парсит строковое представление числа. А у тебя в строке не оно.

fufa58

правильное решение split + int.parse или regex + int.parse
пардон, у меня сложилосьь впечатление, что правльное решение - substring и parse

Dimon89

пардон, у меня сложилосьь впечатление, что правльное решение - substring и parse
Во-первых, ты же не знаешь, в каком месте строки стоит пробел (если длина числа не фиксированная а значит еще придётся поиск по строке делать. Во-вторых, regex должен быть быстрее на большом количестве строк. Впрочем, если бы меня ну о-о-очень сильно интересовала производительность этого куска, я бы написал свой микропарсер типа
while s[i] > ' ' n = n*10 + s[i++]-'0'

Dasar

пардон, у меня сложилосьь впечатление, что правльное решение - substring и parse
Такое решение будет сложнее, придется substring совмещать с indexof, фактически повторяя функцию split

Dasar

regex должен быть быстрее на большом количестве строк.
Regex будет медленнее split-а и медленнее indexof-а. В regex-е больше различных сравнений будет делаться, чем в indexof-е и split-е.

fufa58

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

Dimon89

Regex будет медленнее split-а и медленнее indexof-а. В regex-е больше различных сравнений будет делаться, чем в indexof-е и split-е.
Печально, если так.

evgen5555

точнее substring для первых 11 символов, потом split по пробелу, и потом уже parse

val63

Да ну, если простой регекс, то он разложитя в DFA и будет быстрее.
А если в сборку скомпилировать, то еще быстрее
Upd:
А вообще причем тут производительность?

apl13

Такое решение будет сложнее, придется substring совмещать с indexof, фактически повторяя функцию split
Вот хуй там.
Пока split добросовестно смотрит строку до конца, indexof давно уже нашел первое вхождение и пьет пиво на Канарах.

Dasar

>> Такое решение будет сложнее, придется substring совмещать с indexof, фактически повторяя функцию split
> Пока split добросовестно смотрит строку до конца, indexof давно уже нашел первое вхождение и пьет пиво на Канарах.
Это обычно называется термином производительнее.
Сложность решения измеряет, как много термов используется в записи решения, и на сколько используемые комбинации термов часто встречаются в других решениях.
зы
хотя конечно есть еще вычислительная сложность, которая синоним производительности.

Dasar

Да ну, если простой регекс, то он разложитя в DFA и будет быстрее.
А если в сборку скомпилировать, то еще быстрее
a split не DFA представляет собой, что ли?
если брать "красивый" regex для данного случая: "(\d+) \w\w", то он скомпилируется в цикл, который
 сделает по два сравнения на каждую цифру,
 сделает одно неверное сравнение пробела с цифрой,
 сделает сравнение с пробелом,
 сделает по два сравнения на каждую букву (если буквы русские и уникод, то сравнений будет под десяток, если не больше).
итого по два сравнения на каждый символ, при этом кода много и в конвеер процессора он будет влазить хуже, чем простой код split-а.
Split сравнивает каждый символ с пробелом, при этом такая проверка векторизируется.
В данном случае строки иммутабельные - regex скопирует только символы числа, split скопирует всё кроме пробелов.
Итого, лишнее сравнение на каждый символ vs копирование двух лишних символов.
зы
Если брать "некрасивый" regex "([^ ]+) .*], то очень хороший компилятор regexp-а может догадаться развернуть в сравнение каждого символа с пробелом и игнорирование хвоста после пробела.Такое вариант будет быстрее split-а (не будет сравнений и копирований хвоста особенно если regex будет скомпилирован на этапе компиляции.
Оставить комментарий
Имя или ник:
Комментарий: