Przyspieszenie ładowania danych z pliku

0

Witam, tworzę grę Milionerów i funkcje losowania i ładowania pliku są dość wolne, tu kod:

 
public Form1()
        {
            InitializeComponent();
            InitCustomLabelFont();
            Belka.Font = new Font(pfc.Families[0], Belka.Font.Size);
            A_label.Font = new Font(pfc.Families[0], A_label.Font.Size);
            B_label.Font = new Font(pfc.Families[0], B_label.Font.Size);
            C_label.Font = new Font(pfc.Families[0], C_label.Font.Size);
            D_label.Font = new Font(pfc.Families[0], D_label.Font.Size);

            if (File.Exists(pytania))
            {
                int ilość_pyt = Convert.ToInt32(new StreamReader(pytania).ReadLine()); //pobranie pierwszej linii z pliku
                while (list.Count != 15) //list.Count != maks. liczba pól (15), potrzebne 15 pytań
                {
                    int i = new Random().Next(1, ilość_pyt + 1); // Next(1, 16) - od 1 włącznie do 15 włącznie
                    if (list.Contains(i))
                        continue;
                    else
                        list.Add(i);
                }
            }
            else { MessageBox.Show("Nie ma pliku z pytaniami! (" + pytania + ")", "Błąd"); Close(); }
        }

public void ŁadujPytanie()
        {
            int pyt = list[numer_pytania - 1] + ((list[numer_pytania - 1] - 1) * 4);
            Belka.Text = File.ReadLines(pytania, Encoding.Default).Skip(pyt).Take(1).First().Split('-').Last();
            A_label.Text = File.ReadLines(pytania, Encoding.Default).Skip(pyt + 1).Take(1).First();
            B_label.Text = File.ReadLines(pytania, Encoding.Default).Skip(pyt + 2).Take(1).First();
            C_label.Text = File.ReadLines(pytania, Encoding.Default).Skip(pyt + 3).Take(1).First();
            D_label.Text = File.ReadLines(pytania, Encoding.Default).Skip(pyt + 4).Take(1).First();
            numer_pytania++;
        }

Nie dałoby się tego jakoś przyspieszyć? Za pomoc bardzo dziękuję.

1

Najlepiej wczytać plik raz, a potem go przetwarzać, zamiast czytać plik wielokrotnie.

No, a przede wszystkim Random powinno być statycznym polem klasy. Tworząc nowy obiekt tego typu w pętli, sprawiasz, że za każdym razem losuje tę samą wartość, aż czas systemowy zmieni się na tyle, żeby zwrócił inną, co trwa.

1

jest kilka lepszych sposobow od tego co teraz robisz.

Sadze ze najprotszym dla Ciebie bedzie

string[] lines = File.ReadAllLines(sciezkaDoPliku); 

https://msdn.microsoft.com/en-us/library/s2tte0y1(v=vs.110).aspx

a pozniej odpowiednio indeksowac lines (nie podales jak wyglada format lines, zapewne na nim mozna tez duzo ulepszyc)

0

Ok dzięki, Random dałem przed pętlę, wczytywanie też poprawię.

@fasadin plik wygląda tak (20 pytań i do każdej 4 odpowiedzi, później zrobię więcej):

20
1-Która z planet ma pierścień?
Saturn
Pluton
Neptun
Merkury
2-Jaka jest najdłuższa rzeka świata?
Amazonka
Wisła
Nil
Dunaj
...

0

Jeszcze szybsze będzie czytanie z tzw. memory mapped files

https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile(v=vs.110).aspx

lub bezpośrednio rozmawiając z WinAPI (CreateFile + CreateFileMapping + MapViewOfFile)

Zacznij też sprawdzać kody błędów, a w przypadku .NET używaj try {} i catch {} do łapania wyjątków, gdy np. plik nie zostanie znaleziony (a nawet jak zostanie znaleziony to może wystąpić wyjątek przy dostępie do niego), żeby program się nie wysypał chamsko tylko żebyś np. wyświetlił komunikat błędów. Ja bym też nie używał znaków narodowych do nazywania funkcji, czy czegokolwiek, raz, że robi się syf przy zapisywaniu pliku (UTF8 / ANSI), a dwa wyobraź sobie, że dostajesz od kogoś kod z Chin i ma po chińsku nazwane funkcje, np. w tutorialu.

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