Учитывая число и длину, добавьте (length — number.count) 0s к этому int производительным образом в C#

#c# #arrays #.net #string

#c# #массивы #.net #строка

Вопрос:

Я пытаюсь создать вспомогательную функцию, которая добавляет x нулей к целому числу, где x — это разница между заданной длиной и количеством символов в этом int.

Например:

      // data = 9573132375
     // length = 15
     // should return (15 - 10) 000009573132375
     public string ModulateData(long data, int length)
     {
        if (data.ToString().Length <= length)
        {
            int noToPrepend = length - data.ToString().Length;
            string leadingzeros = "";
            for (int i = 0; i < noToPrepend; i  )
            {
                leadingzeros  = "0";
            }

            return leadingzeros   data.ToString();
        } 
        return "";
     }
  

Я могу думать только о преобразовании переменной данных в строку, добавляя 0s и преобразуя строку обратно в целое число позже. Тем не менее, я обеспокоен производительностью этого подхода, поскольку этот метод будет частью моего основного проекта, он должен быть как можно более производительным. Есть ли более быстрый способ, которым это можно сделать? Есть ли какие-либо проблемы с производительностью в моем текущем коде?

РЕДАКТИРОВАТЬ Я передаю переменную данных в качестве данных запроса на компьютер, который принимает байты, поэтому я буду использовать эту функцию следующим образом —

 string requestdata = "";
requestdata  = ModulateData(x,20);
requestdata  = ModulateData(y,5);
requestdata  = ModulateData(z,10); // Could be about 20 or so lines like this.
  

После этого я преобразоваю requestdata в массив байтов в шестнадцатеричном формате. У меня уже есть рабочий код для этого.

Комментарии:

1. Знаете ли вы о строке. PadLeft ?

2. Действительно, data.ToString().PadLeft(length) было бы моей предложенной отправной точкой. (И да, выполнение повторной конкатенации после этого обходится дорого, и вы дважды преобразуете data в строку.)

3. Спасибо, я только что прочитал документацию, и я полагаю, что мог бы реорганизовать свою вышеупомянутую функцию. Тем не менее, я заинтересован в том, чтобы услышать мнения о производительности или другие методы, которые могут быть лучше.

4. «добавление 0s и последующее преобразование строки обратно в целое число» Почему вы преобразуете строку обратно в целое число? Это удалит начальные 0s (потому что числа не имеют начальных 0s)…

5. Что касается производительности, лучший способ определения производительности — протестировать ее с помощью используемого вами кода, в ситуации, когда вы его используете, с помощью программного обеспечения для сравнительного анализа.

Ответ №1:

Более короткая версия:

 public static string ModulateData(long data, int length) =>
            (data.ToString().Length <= length)
                ? $"{new string('0', length - data.ToString().Length)}{data}"
                : string.Empty;
  

И более отладочную версию, если хотите:

 public static string ModulateData(long data, int length)
{
    var dataAsText = data.ToString();

    if (dataAsText.Length <= length)
    {
        int noToPrepend = length - dataAsText.Length;
        var leadingZeros = new string('0', noToPrepend);

        return $"{leadingZeros}{dataAsText}";
    }

    return string.Empty;
}
  

И использование:

 // to make this more optimal you can calculate the StringBuilder initial capacity here, 
// by taking into account possible characters length output
var requestData = new StringBuilder(); 

requestData.Append(ModulateData(x, 20));
requestData.Append(ModulateData(y, 5));
requestData.Append(ModulateData(z, 10));