подстрока согласно некоторому знаку - PullRequest
2 голосов
/ 21 июня 2011

Q:

Я хочу получить подстроки согласно некоторому знаку, например -.

EX:

, если у меня есть строка, подобная этой:

saturday-sa-0-

и я хочу получить:

saturday

sa

0

Я ищу и нахожу следующий метод:

string substring = name.Split('-')[i];

мой пример блока кода:

foreach (string name in q)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        string substring = name.Split('-')[i];
                    }
                }

но я читаю комментарии о недостатках производительности, когда у меня длинная строка .. мой вопрос: есть ли способ подстроки в соответствии с конкретными sign и не повлиять плохо на код производительности?

Ответы [ 4 ]

3 голосов
/ 21 июня 2011

Разделение строки - O(N), не больше и не меньше, что является реальной сложностью String.Split Так что даже если вы напишите свою собственную процедуру, она не может быть ДЕЙСТВИТЕЛЬНО быстрее.Возможно, это может быть немного быстрее.В любом случае, сначала убедитесь, что производительность String.Split действительно неудовлетворительна для вас.

И да, если вы разделяете снова и снова в LOOP, тогда это будет проблемой производительности.Вы должны сначала разделить его, а затем перебрать массив - см. Другие ответы

2 голосов
/ 21 июня 2011

Проблемы, связанные с разделением, связаны с его чрезмерным использованием. Если вам нужно разделить строку на символ, то разделите строку. Regex является следующим наиболее часто используемым способом, но поставляется с собственным набором или характеристиками производительности. Если вам действительно нужно держать отпечаток ноги в малом объеме, сканируя строку, и выполнение обработки на месте - ваш лучший вариант, однако это также чревато опасностью, поскольку строка .net неизменна, и вы вполне можете запустить ее так же, как и при работе. с разделением Так что я думаю, что самое главное - это использование split, и если это не отвечает вашим потребностям, переоцените.

2 голосов
/ 21 июня 2011

Во-первых, вы должны выполнить операцию разделения только один раз. Т.е. вместо

some loop {
    ...
    string substring = name.Split('-')[i];
    ...
}

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

string[] substrings = name.Split('-');
some loop {
    ...
    string substring = substrings[i];
    ...
}

Во-вторых, не беспокойтесь о производительности Strint.Split слишком много, если

  • у вас реальная, измеримая проблема производительности и
  • вы знаете, что виноват String.Split.

Например, если у вас есть какая-либо операция с базой данных, которая занимает 1 секунду, на самом деле не имеет значения, если последующая операция разделения займет 0,001 или 0,002 секунды.


РЕДАКТИРОВАТЬ : Относительно кода в вашем комментарии: Вы можете рефакторинг

foreach (string name in q) {
    for (int i = 0; i < 3; i++) {
       string substring = name.Split('-')[i]; 
       // do something with substring
    }
}

до

foreach (string name in q) {
    string[] substrings = name.Split('-'); 
    for (int i = 0; i < 3; i++) {
       string substring = substrings[i]; 
       // do something with substring
    }
}
1 голос
/ 21 июня 2011

Я бы сказал, что это зависит от ваших данных. Тем не менее, вы не должны повторно делать ...

string substring = name.Split('-')[i];

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

string[] parts = name.Split('-');

... а затем используйте ...

string substring = parts[i];

... для доступа к соответствующим частям.

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