Правовая оговорка: Этот ответ полностью non-programming-related. Это действительно, однако, пытается напасть на причину сценариев во-первых.
Другая идея состоит в том, если у Вас действительно есть ограниченное количество для продажи, почему Вы не изменяете ее от обслуживание в порядке поступления методология? Если, конечно, шумиха не является частью Вашей маркетинговой схемы.
существует много других опций, и я уверен, что другие могут думать о некоторых различных:
очередь упорядочивания (система предзаказа) - Некоторые сценарии могли бы все еще закончиться впереди очереди, но это, вероятно, быстрее только к, вручную вводят информацию
система лотереи (все, кто пытается приказать, чтобы каждый был введен в систему) - Этот способ, без которого у людей со сценариями есть просто те же возможности как те.
приоритетная очередь порыва - Если существует действительно высокое воспринятое значение, люди могут быть готовы заплатить больше. Реализуйте очередь упорядочивания, но позвольте людям платить больше, чтобы быть помещенными выше в очереди.
аукцион (кредит переходит к David Schmitt для этого, комментарии, является моим собственным) - Люди могут все еще использовать сценарии для стрельбы из укрытия в в последнюю минуту, но мало того, что это изменяет структуру оценки, люди ожидают побеждать его с другими. Можно также сделать вещи ограничить количество предложений в данном периоде времени, заставить людей позвонить в загодя для кода авторизации, и т.д.
Если точная точность не важна, используйте double:
double gb = kb / 1048576D
Согласитесь с Павлом здесь - на самом деле нет необходимости реорганизовывать этот код ... на самом деле, если это самая большая проблема в вашей кодовой базе, я думаю, вы могли бы сидеть на самом хорошо написанном программном обеспечении.
Исходный код краткий, легко читаемый, с разумными именами переменных, самодокументирующийся; Я бы не стал его менять.
Если вам абсолютно необходимо провести рефакторинг, вы можете создать набор методов расширения для числовых типов:
public static double BytesToKilobytes(this Int32 bytes)
{
return bytes / 1024d;
}
public static double BytesToMegabytes(this Int32 bytes)
{
return bytes / 1024d / 1024d;
}
public static double KilobytesToBytes(this double kilobytes)
{
return kilobytes * 1024d;
}
//You can then do something like:
double filesize = 32.5d;
double bytes = filesize.KilobytesToBytes();
Но если ваш код не делает практически ничего, кроме преобразования байтов в килобайты и т.д., все это действительно будет делать - это загромождать Intellisense без особой выгоды.
Лично я бы написал это так: десятичный ГБ = КБ / (1024 * 1024);
, но на самом деле нет необходимости реорганизовывать написанный код.
Что ж, формула неверна (в гигабайте всего около миллиона килобайт, а не тысяча миллионов), но в остальном все в порядке. Любой, кто привык работать с этими числами, знает, что они означают.
Одна вещь, на которую я хотел бы обратить внимание (и я не знаю, является ли это проблемой для C #), - это то, что компилятор не сможет оптимизировать x / 1024/1024
, если x
не является базовым типом. С помощью C и целых чисел компилятор довольно легко превратит это в инструкцию «ослепительно-быстрый сдвиг вправо на 20 бит».
Если decimal является классом, а не базовым типом, компилятору, возможно, придется сделать две операции деления. Оказывает ли это какое-либо реальное влияние на скорость (или даже происходит ли это вообще), находится за пределами моей области знаний.
Одно я ' Я бы подумал об изменении фактических имен переменных. Это не имеет никакого значения для скомпилированного кода, но я предпочитаю более длинные имена переменных, а не сокращения, поэтому я бы выбрал kiloBytes / gigaBytes
или что-то в этом роде. КБ / ГБ
слишком легко спутать с константами, в зависимости от ваших стандартов кодирования.
Чтобы убедиться, что компилятор предварительно вычисляет делители:
decimal GB = KB / (1024 * 1024);
Обратите внимание, что вы фактически вычисляете ГиБ (гибибайт), а не ГБ (гигабайт). Если вы действительно хотите рассчитать ГБ, это будет:
decimal GB = KB / (1000 * 1000);
Теоретически это быстрее (предварительное вычисление константы для умножения вместо деления). Вероятно, он используется не так часто, чтобы иметь значение, но на всякий случай.
double const KbToGbFactor = 1d / 1024 /1024;
double gb = kb * KbToGbFactor;
Я разработал этот метод здесь, работает до ТБ.
private static string FormatBytes(long bytes)
{
string[] Suffix = { "B", "KB", "MB", "GB", "TB" };
int i;
double dblSByte = bytes;
for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024)
{
dblSByte = bytes / 1024.0;
}
return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]);
}