Кастинг и производительность в C # - PullRequest
1 голос
/ 24 сентября 2011

Я пишу код, который выбирает данные из базы данных, сохраняет их в DataTable, выполняет некоторую сложную математику и обновляет базу данных обратно.

Основная проблема заключается в том, что требуется много приведенияиз-за того, что коллекции DataRow возвращают столбцы в качестве типа объекта, вынуждают меня выполнять float.parse () каждую строку и отнимают много времени.

У вас, ребята, есть предложения, как мне этого избежать?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 24 сентября 2011

float.Parse - это , а не - это то же самое, что и кастинг. Вы должны иметь возможность на самом деле привести значение, например, один из

(float) row["Foo"]
(double) row["Foo"]
(decimal) row["Foo"]

в зависимости от типа. Это позволит избежать повторного анализа - вы просто распаковываете. Вам может понадобиться распаковать и cast, если значение не соответствует нужному вам типу, например

(float) (double) row["Foo"]

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

2 голосов
/ 24 сентября 2011

Если ваша база данных возвращает float, вам не нужно использовать float.parse. Предполагая, что у вас есть DataRow row, вы можете просто использовать что-то вроде этого:

float val = (float)row["column"];
2 голосов
/ 24 сентября 2011

заставляет меня выполнять float.parse () каждую строку

Если вам нужно float.parse () , вы что-то делаете неправильно.Вы должны хранить столбец в числовом типе (float, numeric, decimal, money и т. Д.), А не в строковом типе (char, varchar, nvarchar и т. Д.), И если вы делаете это значение в столбце datarow уже является типом, так что вы можете использовать простое (float) приведение (и, возможно, проверку для DBNull).

float.parse () - это вдвойне плохо, потому чтовы не только должны анализировать значение из строки, но вы должны сначала создать строку для анализа ... вы платите за это дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...