Wyszukiwanie pojedynczego tekstu w stringu

0

Witam. Natrafiłem na pewien problem i potrzebuje przerobić mała metodę. Wygląda ona następująco, podesłana bodajże przez FAKEaccout

        public static List<int> AllIndexesOf(string str, string findIT) // TO NIEWAŻNE
        {
            return Regex.Matches(str, findIT).Cast<Match>().Select(m => m.Index).ToList<int>();
        } 

W tym rzecz, że szuka pięknie, za pięknie bo jeżeli wykorzystuje tego do przeszukiwania ścieżek do plików to jest lipa. Folder nazwany woda ma w sobie 5-6 innych folderów, przez co przy zwracaniu ścieżki występuje coś takiego:

Najpierw idzie
woda/*.* plik, później
woda/folder1/*.*
woda/folder2/*.*
woda/folder3/*.* ...

W tym wypadku zliczy mi wystąpienie = 4, natomiast musi w takim wypadku zwrócić tylko jedno wystąpienie. Wiecie może jak ten problem rozwiązać? Nie chce sztywno wklepać nazwy folderu i na jej podstawie rozpoznawać bo folderów będzie mnóstwo i każda inna nazwa folderu będzie mogła mieć taki przypadek. Z góry dzięki :)

2
        public static List<int> AllIndexesOf(string str, string findIT) // TO NIEWAŻNE
        {
            var idx = str.IndexOf(findIt);
            return idx == -1 ? new List<int>() : new List<int> { idx };
        } 

przyznasz ze wyglada totalnie bez sensu, ale staralam sie odwzorowac to o co prosisz. musisz napisac co probujesz zaimplementowac, bo najprawdopodobniej zle sie do tego zabrales

0

Nawet nie wiem od czego zacząć bo trochę tego dużo jest ale mniej więcej jest coś takiego, że pobieram ścieżki do plików, ścieżki te zapisuje do stringa i na tym stringu sprawdzam ile razy wystąpił jaki plik. Wszystko jest dobrze dopóki nie ma folderu w folderze bo wtedy program wariuje i zalicza ścieżkę woda/. jak i woda/kosmos/. czego w drugim przypadku nie powinien robić. Później jak tak zliczy to wychodzi, że folder woda ma 20 plików a tak naprawdę jest tam tylko jeden :/

0

ale po co zapisujesz to wszystko do wielkiego stringa? problem zliczania plikow powstal juz dawno temu i wiele osob sie z nim borykalo, praktycznie kazde srodowisko oferuje gotowe sposoby na radzenie sobie z takimi zadaniami. popatrz np. na http://stackoverflow.com/questions/1395205/better-way-to-check-if-path-is-a-file-or-a-directory albo tu http://stackoverflow.com/questions/16193126/counting-the-number-of-files-in-a-folder-in-c-sharp

0

Ale ja nie dość, że muszę je zliczyć to i otworzyć, pobrać content i odłożyć. Może powiem co mam do zrobienia to pójdzie łatwiej, jakiś łatwiejszy sposób mi podsuniecie bo chyba sam sobie pod górkę robię.

Potrzebuje zrobić program, który skleja content z różnych plików .xml. Mam główny plik .xml ze zbudowanym requestem oprócz danych, te dane muszę skleić z plików .xml, które są porozrzucane i na koniec wstawić w ten zbudowany request i wysłać, po czym kleić nastepne.
struktura folderów:

test/Main/main.xml
test/abc/1.xml
test/abc/2.xml
test/abc/3.xml
test/bbb/1.xml <-- tutaj w tym xml jest przekierowanie na następne pliki .xml, wygląda tak <!-- file(/bbb/add/*.xml) --> <!-- file(/bbb/del/*.xml) --> <!-- file(/bbb/pol/*.xml) -->
test/bbb/add/1.xml
test/bbb/add/2.xml
test/bbb/del/1.xml
test/bbb/del/2.xml
test/bbb/pol/1.xml
test/bbb/pol/2.xml
test/cba/1.xml
test/cba/2.xml

Potrzebuje odczytać te pliki, które są wymagane w main.xml czyli tak:

<abc>
<!-- file(/abc/*.xml) -->
</abc>
<bbb>
<-- file(/bbb/*.xml) -->
</bbb>...

w kolejności takiej aby nie pominąć żadnego pliku np. 1,1,1,1 -- 1,1,1,2 -- 1,1,2,2 -- 1,2,2,2 -- 2,2,2,2 -- 2,2,2,3... aż do wyczerpania plików

0

Podbijam, pomoże ktoś?

0

przeczytales i zrozumiales o co mi chodzilo w poprzednim poscie? z czym konkretnie masz problem, z odczytywaniem plikow, z parsowaniem ich zawartosci, z laczeniem tej zawartosci w jedna calosc? czemu nie napiszesz sobie osobnych metod robiacych proste, dobrze zdefiniowane czynnosci?

0

public static List<int> AllIndexesOf(string str, string findIT)

Żeby to ładnie współgrało z resztą LINQ, dałbym IEnumerable<int> jako typ zwracany i wywalił ToList z wnętrza funkcji.
W ten sposób zachowana będzie konwencja używana w LINQ, że co tylko może to powinno być ewaluowane leniwie.
Potem można dodać ToList w miarę potrzeby na zewnątrz funkcji:

List<int> = AllIndexesOf(cośtam).ToList();

1 użytkowników online, w tym zalogowanych: 0, gości: 1