O ile nie brakuje mi oczywistej wbudowanej metody, jaki jest najszybszy sposób na uzyskanie n- tego wystąpienia ciągu w ciągu?
Zdaję sobie sprawę, że mogę zapętlić metodę IndexOf , aktualizując jej indeks początkowy przy każdej iteracji pętli. Ale robienie tego w ten sposób wydaje mi się marnotrawstwem.
Odpowiedzi:
To w zasadzie to, co musisz zrobić - a przynajmniej jest to najłatwiejsze rozwiązanie. Jedyne, co byś „marnował”, to koszt n wywołań metod - jeśli się nad tym zastanowisz, nie będziesz sprawdzać żadnego przypadku dwa razy. (IndexOf powróci, gdy tylko znajdzie dopasowanie, a ty będziesz kontynuować od miejsca, w którym zostało przerwane).
źródło
StringUtils.ordinalIndexOf()
. C # ze wszystkimi Linq i innymi wspaniałymi funkcjami, po prostu nie ma wbudowanej obsługi tego. I tak, bardzo ważne jest, aby mieć jego wsparcie, jeśli masz do czynienia z parserami i tokenizatorami.string
:)Naprawdę możesz użyć wyrażenia regularnego
/((s).*?){n}/
do wyszukania n-tego wystąpienia podciągus
.W C # może to wyglądać tak:
Uwaga: dodałem
Regex.Escape
do oryginalnego rozwiązania, aby umożliwić wyszukiwanie znaków, które mają specjalne znaczenie dla silnika regex.źródło
value
? W moim przypadku szukałem kropki msdn.microsoft.com/en-us/library/…Oto rekurencyjna implementacja (powyższego pomysłu ) jako metoda rozszerzająca, naśladująca format metody (metod) frameworka:
Oto kilka testów jednostkowych (MBUnit), które mogą Ci pomóc (udowodnić, że są poprawne):
źródło
lub w C # z metodami rozszerzającymi
źródło
index
początkowo wartość -1."BOB".IndexOf("B")
zwraca 0, więc ta funkcja powinnaIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
nie sprawdza, czys
jestnull
. I String.IndexOf (String, Int32) zgłosi,ArgumentNullException
jeślimatch
jestnull
.Może fajnie byłoby też popracować z
String.Split()
Metodą i sprawdzić, czy żądane wystąpienie znajduje się w tablicy, jeśli nie potrzebujesz indeksu, ale wartość w indeksieźródło
Po przeprowadzeniu testów porównawczych wydaje się, że jest to najprostsze i najbardziej wydajne rozwiązanie
źródło
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
napisanie funkcji z tego to praca domowa
źródło
Odpowiedź Toda można nieco uprościć.
Wynik
źródło
Lub coś takiego z pętlą do while
źródło
Może to zrobić:
źródło