Просто вставляем мои два цента. Если вы хотите «ведро» списка (визуализировать слева направо), вы можете сделать следующее:
public static List<List<T>> Buckets<T>(this List<T> source, int numberOfBuckets)
{
List<List<T>> result = new List<List<T>>();
for (int i = 0; i < numberOfBuckets; i++)
{
result.Add(new List<T>());
}
int count = 0;
while (count < source.Count())
{
var mod = count % numberOfBuckets;
result[mod].Add(source[count]);
count++;
}
return result;
}
Кастинг не предполагает никакого преобразования, т. е. внутреннее представление значения не изменяется. Пример:
object o = "Hello"; // o is typed as object and contains a string.
string s = (string)o; // This works only if o really contains a string or null.
Вы можете преобразовать double
в string
, как это
double d = 5;
string s = d.ToString(); // -> "5"
// Or by specifying a format
string formatted = d.ToString("N2"); // -> "5.00"
Вы можете преобразовать string
в double
несколькими способами (здесь только два из них):
string s = "5";
double d = Double.Parse(s); // Throws an exception if s does not contain a valid number
Или безопасный способ
string s = "5";
double d;
if (Double.TryParse(s, out d)) {
Console.WriteLine("OK. Result = {0}", d);
} else {
Console.WriteLine("oops!");
}
Convert.ToDouble()
внутренне вызывает Double.Parse()
. Могу ли я использовать Convert.ToDouble()
по сравнению с Double.Parse()
или нет и почему?
– user
13 March 2013 в 21:31
Convert.ToDouble
имеет много перегрузок, которые принимают разные типы ввода. Приёмка string
перегрузки возвращает 0.0
, если передана строка null
. Кроме того, я не вижу возможности использовать его.
– Olivier Jacot-Descombes
13 March 2013 в 21:44
Double.Parse()
есть что предложить, что я должен рассмотреть?
– user
13 March 2013 в 21:50
Double.Parse()
является более прямым, чем Convert.ToDouble()
. Если вы уверены, что ваша строка будет содержать действительное число, вы можете безопасно ее использовать, иначе я советую вам использовать Double.TryParse
.
– Olivier Jacot-Descombes
13 March 2013 в 21:57
Метод Convert.Double
фактически просто внутренне вызывает метод Double.Parse(string)
.
Ни тип String
, ни тип Double
не определяют явное / неявное преобразование между двумя типами, поэтому литье всегда будет терпеть неудачу.
Метод Double.Parse
будет смотреть на каждый символ в string
и строить числовое значение, основанное на значениях символов в string
. Если какой-либо из символов недействителен, метод Parse
завершается с ошибкой (что также приводит к сбою метода Convert.Double
).
Convert.ToDouble()
смотреть за пределы байтов и рассматривать данные?
– user
13 March 2013 в 21:03
Приведение строки в double, подобное этому, не допускается C #, поэтому вы получаете исключение, вам нужно преобразовать строку ( MSDN doc , которая показывает допустимые пути преобразования). Это просто потому, что строка не обязательно будет содержать числовые данные, но различные числовые типы (запрет нулевых значений). A Convert
будет запускать метод, который проверяет строку, чтобы увидеть, можно ли ее преобразовать в числовое значение. Если это возможно, тогда оно вернет это значение. Если он не может, он выдаст исключение.
Чтобы преобразовать его, у вас есть несколько вариантов. Вы использовали метод Convert
в своем вопросе, есть Parse
, который во многом похож на Convert
, но вы также должны посмотреть на TryParse , который позволит вам сделать:
string variable = "5.00";
double varDouble;
if (Double.TryParse(variable, out varDouble)) {
//Code that runs if the conversion succeeded.
} else {
//Code that runs if the conversion failed.
}
Это позволяет избежать возможного исключения, если вы попытаетесь выполнить Convert
или Parse
нечисловую строку.
TryParse
над Convert
, потому что TryParse
проверяет, выполнено ли преобразование?
– user
13 March 2013 в 21:39
Из MSDN
:
Явные преобразования (приведения): для явных преобразований требуется оператор трансляции. Кастинг необходим, когда информация может быть потеряна при конверсии или когда преобразование может не удаться по другим причинам. Типичные примеры включают числовое преобразование в тип с меньшей точностью или меньшим диапазоном и преобразование экземпляра базового класса в производный класс.
blockquote>Рассмотрим следующий пример:
double a = 2548.3; int b; b = (int)a; //2548 --> information (.3) lost in the conversion
А также:
Листинг - это способ явного информирования компилятора о том, что вы намерены сделать преобразование, и что вы знаете, что может произойти потеря данных.
blockquote>Вы можете использовать класс
System.Convert
, если хотите конвертировать между несовместимыми типами. Основное различие между литьем и convert - компиляция и время выполнения . Исключения преобразования типов появляются во время выполнения, то есть при выполнении типа, который не выполняется во время выполнения, будет выведеноInvalidCastException
. Вывод: при кастинге вы сообщаете компилятору, чтоa
действительно является типомb
, и если это так, то проект строится без каких-либо ошибок, таких как этот пример:double s = 2; int a = (int) s;
Но в преобразовании вы говорите для компилятора существует способ создать новый объект из
a
типаb
, пожалуйста, сделайте это и постройте проект без каких-либо ошибок, но, как я уже сказал, , если листинг типа не работает во время выполнения, это вызоветInvalidCastException
, который должен быть брошен .Например, код ниже никогда не компилируется, потому что компилятор обнаруживает, что не может выразить выражение типа
DateTime
для вводаint
:DateTime s = DateTime.Now; int a = (int)(s);
Но этот файл скомпилирован успешно:
DateTime s = DateTime.Now; int a = Convert.ToInt32(s);
Но во время выполнения вы получите
InvalidCastException
, в котором говорится:Недопустимый литой от 'DateTime' до 'Int32'.
< / BLOCKQUOTE>
В вашем примере вы пытаетесь передать строку двойному (не целочисленному типу).
Для этого требуется явное преобразование.
И я должен указать что вы могли бы использовать Convert.ToDouble
вместо Convert.ToInt64
, поскольку вы можете потерять дробные части двойного значения при преобразовании в int.
, если ваша переменная имеет значение «5.25», varDouble будет иметь было 5,00 (потеря 0,25 из-за конверсии в Int64)
Чтобы ответить на вопрос о кастинге и конвертировании.
Ваш актерский состав (явное литье) не соответствует требованиям для явное приведение. значение, которое вы пытаетесь выполнить с помощью оператора трансляции, недопустимо (т. е. не является интегралом).
Посетите эту страницу MSDN для правил литья / конверсий
string variable = "5.00";
double varDouble = (double)variable;
Вышеперечисление просто запрещено на языке. Ниже приведен список явных заданий для числовых типов: http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx Как вы можете видеть, даже не каждый числовой тип может быть преобразован к другому численному типу
Более подробная информация о литье здесь
И как это отличается от Convert.ToDouble ()?
blockquote>Когда вы создаете тип, структура данных не изменяется. Ну, в случае преобразования числовых значений вы можете потерять несколько бит или получить несколько дополнительных 0 бит. Но вы все еще работаете с номером. Вы просто меняете объем памяти, полученный этим числом. Это достаточно безопасно для компилятора, чтобы все было необходимо.
Но когда вы пытаетесь наложить строку на число, вы не можете этого сделать, потому что этого недостаточно, чтобы изменить объем памяти, взятый переменной. Например, 5.00 в виде строки представляет собой последовательность «чисел»: 53 (5) 46 (.) 48 (0) 48 (0) - это для ASCII, но строка будет содержать нечто подобное. Если компилятор просто возьмет сначала N (4 для двухзначных) байт из строки - эта часть будет содержать совершенно другой двойной номер. В то же время Convert.ToDouble () запускает специальный алгоритм, который принимает каждый символ строки, выставляет цифру, которую он представляет, и делает для вас двойной номер, если строка представляет число. Языки, подобные PHP, грубо говоря, вызовут Convert.ToDouble для вас в фоновом режиме. Но C #, как статически типизированный язык, не сделает этого для вас. Это позволяет вам быть уверенным, что любая операция безопасна по типу, и вы не получите что-то неожиданное, делая что-то вроде:
double d = (double)"zzzz"