Как эффективно использовать запятую - PullRequest
0 голосов
/ 03 мая 2011

Я работаю на C #. У меня есть массив. Для разделения элементов массива мне нужно использовать запятую. Я сделал это, но я думаю, что это не эффективно. Как это сделать без условия if? Пожалуйста, не используйте метод замены. Мой синтаксис ниже.

string container = "";
string[] s = "Hellow world how are you".Split(' ');
foreach (string item in s)
{
    if (container == "")
    {
        container += item;
    }
    else
    {
        container += "," + item;
    }
}

Мне нужно продолжить цикл. Я просто хочу ниже решение типа.

string container = "";
string[] s = "Hellow world how are you".Split(' ');
foreach (string item in s)
{
    container += "," + item;
}

Спасибо заранее. Если есть какие-либо вопросы, пожалуйста, спросите.

Ответы [ 3 ]

13 голосов
/ 03 мая 2011

Использование String.Join для объединения массива с разделителями-запятыми.

string[] s = "Hello world how are you".Split(' ');
string container = String.Join(",", s);

Кроме того, если вам нравится получать помощь на этом сайте, я рекомендую вам начать принимать несколько ответов.

5 голосов
/ 03 мая 2011

Ваша проблема не в выражении if. Ваша проблема в том, что в общем случае плохая форма и плохая практика - выполнять конкатенацию строк и другие манипуляции в цикле. Класс string является неизменным, изменения создают новые строки, выделяют новую память и т. Д. В результате эта практика медленная и неэффективная, намного больше, чем ваша инструкция if. Чем больше итераций цикла, тем больше вы заметите неэффективность.

Вам следует ознакомиться с классом StringBuilder, который позволяет вам выполнять эффективные манипуляции с string без многократного выделения новых объектов. Это особенно полезно в циклах, подобных вашей выше.

Пример использования StringBuilder подобен следующему

StringBuilder builder = new StringBuilder();
foreach (string item in array)
{
    if (builder.Length != 0) builder.Append(",");
    builder.Append(item);
}

string finalOutput = builder.ToString();

С учетом сказанного, string.Join также является мощным инструментом для типа конкатенации, которую вы выполняете.

0 голосов
/ 03 мая 2011

string.split начинается со строки , а заканчивается массивом строк и очень быстро Он использует небезопасный код для определения индексов разделителей. Затем он выделяет массив правильного размера, а затем вырезает исходную строку, выделяя кучу других строк.

string.join начинается с массива строк , а заканчивается строкой , а также очень быстр и использует небезопасный код. Он создает буфер и добавляет в буфер каждый элемент в строке, увеличивая строку по мере ее поступления.

Но так как вы хотите Начать со строки и и завершить строкой , лучше всего использовать метод, который использует небезопасный код для замены '' на ',' ,

        string s1 = "Hellow world how are you";
        fixed (char* p = s1)
        {
            for (int i = 0; i < s1.Length; i++)
            {
                if (p[i] == ' ')
                {
                    p[i] = ',';
                }
            }

        }

Это действительно плохая идея

  • Это работает только потому, что источник и цель имеют одинаковую длину
  • Требуется небезопасный код
  • Поскольку я изменяю строку напрямую, все ссылки на строку обновляются
  • Вероятно, есть куча проверок, которые мне не хватает
  • Это только немного быстрее, чем string.replace

Просто используйте String.Replace, если вам действительно нужно, чтобы он был очень быстрым и очень безопасным

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