Самое изящное решение, которое я нашел для проблем как это, является чем-то вроде этого (в псевдокоде)
separator = ""
foreach(item in stringCollection)
{
concatenatedString += separator + item
separator = ","
}
, Вы просто выполняете цикл и только после того, как второй раз вокруг разделителя установлен. Так в первый раз это не будет добавлено. Это не столь чисто, как я хотел бы, чтобы он был так, я все еще добавлю комментарии, но это лучше, чем если оператор или добавление первого или последнего объекта вне цикла.
Разве в классах System.Data.Sql уже нет сопоставлений?
См .: C #: Эквиваленты типов данных SQL Server в .NET Framework .
А теперь сделайте мою поплавком ...
float
Или, если вы хотите придерживаться старой школы:
real
Вы также можете использовать float (53), но это означает то же самое, что и float.
("real" эквивалентно для float (24), а не float / float (53).)
Тип decimal (x, y) SQL Server предназначен для случаев, когда вам нужны точные десятичные числа, а не с плавающей точкой (которые могут быть приблизительными). Это контрастирует с "десятичным" типом данных C #, который больше похож на 128-битное число с плавающей запятой.
MSSQL float не имеет точно такой же точности, как 64-битный тип double в .NET (небольшая разница в мантиссе IIRC), но он достаточно близок для большинства применений.
Чтобы сделать ситуацию более запутанной, "float" в C # - это только 32-битный, Все, что вам нужно, это 5 знаков после десятичной точки, чтобы представить широту и долготу с точностью примерно до одного метра, и вам нужно всего до трех цифр перед десятичной точкой для градусов. Float (24) или decimal (8,5) лучше всего соответствуют вашим потребностям в MSSQL, а использование float в C # достаточно хорошо, вам не нужно double. Фактически, ваши пользователи, вероятно, будут благодарить вас за округление до 5 знаков после запятой, вместо того, чтобы использовать кучу незначительных цифр.
Похоже, вы можете выбирать и выбирать. Если вы выберете float, вы можете потерять 11 знаков точности. Если это приемлемо, сделайте это - очевидно, разработчики Linq посчитали это хорошим компромиссом.
Однако, если вашему приложению нужны эти дополнительные цифры, используйте десятичные числа. В любом случае десятичная дробь (реализованная правильно) намного точнее, чем число с плавающей запятой - никакого беспорядочного перевода с основания 10 на основание 2 и обратно.
float
в SQL Server на самом деле имеет [edit: почти] точность «double» (в смысле C #).
float
является синонимом для поплавок (53)
. 53 - это бит мантиссы.
.NET double
использует 54 бита для мантиссы.
float является ближайшим эквивалентом.
Для широты и долготы, как упоминалось в OP.
Метр составляет 1/40 000 000 широты, 1 секунда - около 30 метров. Float / double дают 15 значащих цифр. С помощью некоторых быстрых и изворотливых вычислений в уме ... ошибки округления / аппроксимации будут примерно равны длине этой точки заполнения -> "."
Для SQL-сервера:
Десятичный тип - 128-битное число со знаком Float - это 64-битное число со знаком.
Настоящий ответ - Float , я ошибся насчет десятичного числа.
Причина в том, что если вы используете десятичное число, вы никогда не заполните 64 бита десятичного типа .
Хотя decimal не выдаст ошибку, если вы попытаетесь использовать тип int.
Вот хорошая справочная таблица типов.
Вы должны сопоставить его с FLOAT (53) - это то, что делает LINQ to SQL .