Этот вопрос исказил меня - достаточно распространенная проблема, что хорошее решение должно уже существовать, что-то лучше, чем вектор векторов, или катит вашу собственную индексацию массива.
Когда что-то должно существовать в C ++ но нет, первое место для поиска - boost.org . Там я нашел Boost многомерную библиотеку массивов, multi_array
. Он даже включает класс multi_array_ref
, который можно использовать для упаковки собственного одномерного массива.
Использовал бы дважды. TryParse, это имеет выигрыши в производительности.
Я сказал бы, не волнуйтесь так о такой микро производительности. Намного лучше просто заставить что-то работать, и затем делать его максимально ясным и кратким и легким читать. Худшая вещь, которую можно сделать, пожертвовать удобочитаемостью за незначительный объем производительности.
В конце, лучший способ заниматься проблемами производительности состоит в том, чтобы сохранить их для того, когда у Вас есть данные, которые указывают, что существует фактическая проблема производительности... иначе Вы проведете много времени, микрооптимизируя и на самом деле на потом вызовете более высокие затраты на обслуживание на.
, Если Вы находите, эта ситуация с парсингом является действительно узким местом в Вашем приложении, ЗАТЕМ является временем, чтобы попытаться выяснить, какой самый быстрый способ решить проблему. Я думаю, что Jeff (и многие другие) вел блог об этом виде вещи много.
Затруднения, которые Вы испытываете, состоят в том, что могли быть ситуации, где ответ мог быть всеми тремя типами.
3 мог быть интервал, двойное или строка!
Это зависит от того, что Вы пытаетесь сделать и насколько важный случается так, что они - конкретный тип. Могло бы быть лучше только оставить их, как они, пока Вы можете или, альтернативно, некоторые с методом для маркировки каждого (если Вы имеете контроль над источником исходной строки).
Вы получите различные результаты для различных методов в зависимости от того, компилируете ли Вы с оптимизациями на. У Вас в основном есть несколько опций:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof( int )
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse( Convert.ToString( o ), out j )
можно легко настроить консольное приложение, которое пробует каждый из этих 10 000 раз и продолжительностей возвратов для каждого (тест, когда o является интервалом и когда это - что-то еще).
try-catch
метод является самым быстрым, если объект действительно содержит интервал и безусловно самое медленное, если он не делает (еще медленнее, чем GetType
). int.TryParse
довольно быстро, если у Вас есть строка, но если у Вас есть неизвестный объект, это медленнее.
Интересно, с.Net 3.5 и оптимизациями включил эти o is int
, проверка занимает то же время в качестве try-catch
, когда o на самом деле является интервалом o is int
, незначительно медленнее, если o на самом деле - что-то еще.
Раздражающе FxCop подбросит предупреждения, если Вы сделаете что-то как:
if( o is int )
int j = (int) o;
, Но я думаю, что это - ошибка в FxCop - он не знает, что интервал является типом значения и рекомендует Вам использовать o as int
вместо этого.
, Если Ваш вход всегда является строкой int.TryParse
, является лучшим, иначе is
, оператор является самым быстрым.
, Поскольку у Вас есть строка, я посмотрел бы на то, необходимо ли знать, что это - интервал, а не двойное. Если int.TryParse
передачи тогда так будут double.TryParse
, таким образом, Вы могли, половина количества проверок - возвращает или дважды или строка и ставит в тупик удваивание, когда Вы ожидаете интервал
Я лично использовал бы int.tryparse, тогда double.tryparse. Производительность на тех методах является довольно высокой. Они оба возвращают булевскую переменную. Если оба сбоя тогда, у Вас есть строка, на то, как Вы определили свои данные.