Wyszukiwanie w stringu konkretnych wartosci i kopiowanie ich

0

mam plik tekstowy ktory jest zczytywany przez StreamReader i zapisywany jest w stringu, ten plik wyglada tak

[OSOBA]
Borys
Jelcyn
Imperator
Minsc
asdasdsa 21
59-220

[OSOBA]
asds
zxczxc
asdasd
asdasd
zxczxc
asdasd

[OSOBA]
Borys
Lukaszenka
Betonmłot
Kilimandżaro
123123123
123123123

[OSOBA]
Borys
asdasdasd
zxczxczxc
Kilimandżaro
123123123
123123123

[OSOBA]
Jacek
asdasdasd
zxczxczxc
Kilimandżaro
123123123
123123123 

W interfesie użytkownika wybieram, że chce szukać na przykład po imieniu ( dla przykładu "Borys" ) i chce żeby wszystkie osoby o imieniu Borys zostały wyświetlone w TextBoxie, sam proces wyswietlania już zrobiłem. Problem polega na tym, że nie wiem jak zrobić żeby program wyszukał we władowanym stringu imienia Borys, a nastepnie żeby skopiował cały człon z informacjami o Borysie.

Da sie w stringu szukać po wierszach czy tylko po indeksach znaków?
Czy może lepiej wyszukiwanie zrobić z poziomu StreamReadera i do stringa przesłac już zformatowany tekst z wyszukanymi osobami? Jeśli tak to jak?
Czy może lepiej każda linijke pliku wpierw skopiowac do tablicy stringow i w ten sposób na nich operować?

1

Najlepiej sformatować od razu. Stworzyć klasę Osoba odpowiadającą temu co przechowuje plik i podczas wczytywania z pliku od razu ładować do takich obiektów, czyli jeden wpis [OSOBA] == jeden obiekt klasy Osoba. Następnie te obiekty przechowujesz w jakiejś kolekcji np. w List<Osoba> (rozumiem że mówimy o C#). Potem przeszukiwanie jest dość łatwe, bo pętla foreach i if w środku sprawdzający dane pole z imieniem (czy czymkolwiek sobie zażyczysz) i działa. Tak chyba najprościej na początek.

0

Skasowałem poprzedniego posta bo bylo w nim wiele głupstw :P
Dziekuje za pomoc, oto rozwiązanie mojego problemu :)

 while (sr.EndOfStream == false)
               {
                   if (sr.ReadLine() == "[OSOBA]")
                   {
                       osoby.Add(new Osoba());
                       osoby[osoby.Count - 1].Imie = sr.ReadLine();
                       osoby[osoby.Count - 1].Nazwisko = sr.ReadLine();
                       osoby[osoby.Count - 1].Stanowisko = sr.ReadLine();
                       osoby[osoby.Count - 1].Miasto = sr.ReadLine();
                       osoby[osoby.Count - 1].Adres = sr.ReadLine();
                       osoby[osoby.Count - 1].Kodpocztowy = sr.ReadLine();
                   }
               }
2
List<Osoba> osoby = new List<Osoba>();
while(!sr.EndOfStream) // Ja to zwykle robię tak
{
    string line = sr.ReadLine();

    // dalej jakiś warunek
    if(line == "[OSOBA]")
    {
       // tutaj powinno się sprawdzać czy ReadLine() nie zwraca null'a
       string imie = sr.ReadLine();
       string nazwisko = sr.ReadLine();
       // itd. a potem

       Osoba osoba = new Osoba();
       osoba.Imie = imie;
       osoba.Nazwisko = Nazwisko;      
       // itd. i w koncu

       osoby.Add(osoba);
    }
}

No jakoś tak to widzę w najprostszej wersji.

// EDIT
Albo tak jak ty napisałeś. Też może być, tylko że u ciebie ciągle pobierasz z kolekcji nowo stworzona osobe i na niej operujesz, a u mnie tworzysz sobie najpierw "na boku" i tylko raz dodajesz do kolekcji. Ale przy dzisiejszych komputerach, raczej nie odczujesz spadku wydajności jeśli nie będziesz miał tysiąca osób.

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