2014-05-06 10 views
7

Ich habe eine große Textdatei (~ 100MB), die ich seine Zeilen in einer Liste von Zeichenfolgen halte. meine Winform benötigt gelegentlich einen Teil davon zu zeigen, zum Beispiel 500.000 Zeilen.Schnellste Möglichkeit, eine große Textdatei in C# winforms zu zeichnen

Ich habe versucht, eine List-Box verwenden, RichTextBox und TextBox, aber die Zeichnung nimmt zu viel Zeit.

zum Beispiel dauert TextBox 25 Sekunden, um 500.000 Zeilen zu zeigen, während Notizblock öffnet eine Textdatei dieser Größe sofort.

Was wird die schnellste Lösung für diesen Zweck sein?

+0

Sie haben versucht, rechte Steuerelemente, aber im falschen Modus. Suche "Winforms ** virtueller Modus ** " (zum Beispiel Listbox). – Sinatr

Antwort

10

Warum nicht einen Dateistream öffnen und nur die ersten Zeilen lesen. Sie können seek verwenden, während der Benutzer in der Datei scrollt und die entsprechenden Zeilen anzeigt. Der Punkt ist - das Lesen der gesamten Datei in den Speicher dauert zu lange, so nicht tun, dass!

Starter-Code

Es folgt ein kurzer Code-Schnipsel, die nicht abgeschlossen ist, aber es sollte zumindest loszulegen:

// estimate the average line length in bytes somehow: 
int averageLineLengthBytes = 100; 

// also need to store the current scroll location in "lines" 
int currentScroll = 0; 

using (var binaryReader = new StreamReader(new FileStream(fileName, FileAccess.Read))) 
{ 
    if (binaryReader.BaseStream.CanSeek) 
    { 
     // seek the location to read: 
     binaryReader.BaseStream.Seek(averageLineLengthBytes * currentScroll, SeekOrigin.Begin); 

     // read the next few lines using this command 
     binaryReader.ReadLine(); 
    } 
    else 
    { 
     // revert to a slower implementation here! 
    } 
} 

Der größte Trick, wie lange werden wird Abschätzen Die Bildlaufleiste muss (wie viele Zeilen in der Datei enthalten sind). Dazu müssen Sie entweder die Bildlaufleiste ändern, während der Benutzer scrollt oder Sie können Vorkenntnisse, wie lange typische Zeilen in dieser Datei sind und die Länge basierend auf der Gesamtzahl der Bytes schätzen. Wie auch immer, hoffe das hilft!

Ein Hinweis zu virtuellem Modus

virtueller Modus ist ein Verfahren zur Herstellung einer oder ListBox ähnliche Liste Kontrolle der Verwendung der Elemente auf einer Bedarfsbasis zu laden. Das Steuerelement führt einen Rückruf aus, um die Elemente basierend auf einem Index abzurufen, wenn der Benutzer im Steuerelement scrollt. Dies ist nur dann eine praktikable Lösung, wenn Ihre Daten die folgenden Kriterien erfüllen:

  • Sie müssen die Anzahl der Datenelemente, die Sie präsentieren möchten (im Vordergrund), kennen. Wenn Sie die gesamte Datei lesen müssen, um diese Summe zu erhalten, wird es nicht für Sie arbeiten!
  • Sie müssen in der Lage sein, ein bestimmtes Datenelement basierend auf einem Index für dieses Element abzurufen, ohne die gesamte Datei zu lesen.
  • Sie müssen bereit sein, die Daten in einem Symbol, kleine Details, Details oder anderem unterstütztes Format (oder bereit sein, zu einer Tonne zusätzlicher Arbeit zu gehen, um eine benutzerdefinierte Liste Ansicht zu schreiben) zu präsentieren.
  • Wenn Sie diese Kriterien nicht erfüllen können, wird der virtuelle Modus nicht besonders hilfreich sein. Die Antwort, die ich mit seek präsentierte, funktioniert unabhängig davon, ob Sie diese Aktionen ausführen können oder nicht. Natürlich, wenn Sie können erfüllen diese Mindestkriterien, dann auf alle Fälle - suchen Sie im virtuellen Modus für Listenansichten und Sie sollten einige wirklich nützliche Informationen finden!

    +0

    Warum verwenden Sie keine Virtualisierung, wie @Black From schlägt vor (und ist auch auf WPF verfügbar) –

    +1

    @YishaiGalatzer "Virtualisierung", wie Sie es nennen, würde mit einem ListView arbeiten * IF * Sie wissen die genaue Anzahl der Elemente im Voraus . Es beschränkt sich auch nur auf eine bestimmte Schnittstellenoption, anstatt zuzulassen, dass die Daten in der gewünschten Weise angezeigt werden. Auf der Grundlage dieser beiden Fakten betrachtete ich diese als nicht so gut für eine Lösung wie einen generischen Dateileser, der modifiziert werden kann, um das zu tun, was das OP will! –

    +0

    @YishaiGalzer Der Antwort wurde eine Notiz hinzugefügt, um die Vor-/Nachteile des virtuellen Modus zu erklären:) –