Если мне не хватает очевидного встроенного метода, каков самый быстрый способ получить n- е вхождение строки в строке?
Я понимаю, что могу зацикливать метод IndexOf , обновляя его начальный индекс на каждой итерации цикла. Но делать это таким образом мне кажется расточительным.
Ответы:
Это в основном то, что вам нужно сделать - или, по крайней мере, это самое простое решение. Все, что вы «потратите впустую», - это затраты на n вызовов методов - на самом деле вы не будете проверять регистр дважды, если задуматься. (IndexOf вернется, как только найдет совпадение, и вы продолжите идти с того места, где оно было остановлено.)
источник
StringUtils.ordinalIndexOf()
. C # со всеми Linq и другими замечательными функциями просто не имеет встроенной поддержки для этого. И да, очень важно иметь его поддержку, если вы имеете дело с парсерами и токенизаторами.string
:)Вы действительно можете использовать регулярное выражение
/((s).*?){n}/
для поиска n-го вхождения подстрокиs
.В C # это может выглядеть так:
Примечание: я добавил
Regex.Escape
к исходному решению, чтобы разрешить поиск символов, которые имеют особое значение для механизма регулярных выражений.источник
value
? В моем случае я искал точку msdn.microsoft.com/en-us/library/…Вот рекурсивная реализация (вышеупомянутой идеи ) как метода расширения, имитирующая формат метода (ов) фреймворка:
Кроме того, вот несколько модульных тестов (MBUnit), которые могут вам помочь (чтобы доказать, что это правильно):
источник
или в C # с методами расширения
источник
index
изначально установив значение -1."BOB".IndexOf("B")
возвращает 0, то должна и эта функция дляIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
не проверяет, есть лиs
этоnull
. И String.IndexOf (String, Int32) выбросит,ArgumentNullException
еслиmatch
естьnull
.Возможно, было бы также неплохо поработать с
String.Split()
Методом и проверить, находится ли запрошенное вхождение в массиве, если вам не нужен индекс, а значение в индексеисточник
После некоторого тестирования это кажется самым простым и эффективным решением.
источник
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
написание функции из этого - домашнее задание
источник
Ответ Тода можно несколько упростить.
Вывод
источник
Или что-то вроде этого с циклом do while
источник
Это может сделать это:
источник