2016-12-20 6 views
-5

Мне нужно обработать много строк, которые представляют пути к файлам, и я хочу получить количество «сегментов» в полном пути (например, диск, 2 папки и файл), разделенные символом. Например:C# Самый эффективный способ подсчета секций в строке, по разделителю

"C:\Some Folder\Some Folder\somefile.txt" 

Каков самый быстрый способ (с точки зрения вычислительной производительности) работать?

Будет ли это быть просто:

int pathCount = myPath.Split(new string[1] { @"\" }, StringSplitOptions.None).Count(); 

Обратите внимание, что я объявляю строку [] в качестве переменной, которая может быть повторно использован.

Обновление - Я не суетился о том, как рассчитывается счет: подсчет экземпляров разделителя или сегментов между ними.

+1

Не было бы проще подсчитать разделители на пути? –

+0

@JeffMercado - да; не стесняйтесь публиковать ответ. –

+0

Кажется, что было бы очень легко провести сравнение с различными решениями, чтобы узнать «наиболее эффективный» метод в вашей конкретной среде. – itsme86

ответ

2

Самый быстрый способ, безусловно, состоял бы в том, чтобы пройти символ строки по символу и подсчитать количество разделителей.

int sectionCount = 1; 
foreach (var character in inputString) 
{ 
   if (character == '\\') 
    { 
     sectionCount++; 
    } 
} 

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

+0

Вы предполагаете, что подсчет каждого символа« определенно »быстрее, чем использование выражения или метода string? Есть ли основания для этого утверждения? Я бы подумал, что это было бы самым медленным. –

+1

Я бы предложил попробовать несколько тысяч итераций, чтобы увидеть результаты работы, но это определенно будет намного быстрее. Если вы проверите источник .NET, вы увидите, что код для «Split» довольно сложный и будет иметь большие накладные расходы по сравнению с простой итерацией символов. Кроме того, для каждого раздела необходимо создать несколько новых экземпляров строк, снова добавляя накладные расходы памяти. Вот ссылка на источник - https://referencesource.microsoft.com/#mscorlib/system/string.cs,baabf9ec3768812a –

+0

Спасибо - да, я думал, что сплит будет дорогостоящей операцией. Как вы говорите, мне нужно будет провести некоторое тестирование. –

2

Если вы заботитесь только о количестве и на самом деле не заботятся об извлечении разрезные маркеров, это проще (и быстрее), чтобы сделать:

int pathCount = myPath.Count(c => c == '\\') + 1; 

На стороне записки, вы можете также рассмотреть вопрос о «/», так как косая черта также является законной для ограничения пути Windows.

+1

Не забывайте о '' 'Path.DirectorySeparatorChar''' – tym32167

Смежные вопросы