2016-05-07 13 views
-1

Ich habe ein Windows-Formular, das einen StreamReader verwendet, um Formulardaten in einige Textfelder zu lesen. Das funktioniert ganz gut. Das Problem ist jetzt, dass ich die Daten aus der Datei alphabetisch nach Namen geordnet anzeigen möchte. Früh habe ich versucht eine Array.Sort-Methode, damit hat es nicht so gut funktioniert.Sortieren von Daten in der Reihenfolge von StreamReader

Hier ist mein Code:

Hinweis: Ich schließe die Leser und Datei im dispose-Methode.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 

namespace ViewArchives 
{ 
    public partial class Form1 : Form 
    { 
     const char DELIM = ','; 
     const string FILENAME = @"F:\lscSpring2016\CIS2620\FinalProject\TicketMaster\bin\Debug\SoldTickets.txt"; 
     string recordIn; 
     string[] fields; 
     static FileStream file = new FileStream(FILENAME, FileMode.Open, FileAccess.Read); 
     StreamReader reader = new StreamReader(file); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnView_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       recordIn = reader.ReadLine(); 
       fields = recordIn.Split(DELIM); 
       nameBox.Text = fields[0]; 
       ticketsBox.Text = fields[1]; 
       purchaseBox.Text = fields[2]; 
       dateBox.Text = fields[3]; 
      } 
      catch (NullReferenceException) 
      { 
       label5.Text = "You have viewed\nall the records filed."; 
       btnView.Enabled = false; 
      } 
     } 
    } 
} 
+0

'Felder = recordIn.Split (DELIM) .OrderBy (x => x). ToArray(); ' – Eser

+0

Flow-Kontrolle über Ausnahme ist nicht so ein tolles Design. Sie sollten den Rückgabewert von ReadLine() überprüfen; Wenn null, haben Sie das Ende der Datei erreicht. – glenebob

+0

Warum hat Array.Sort() nicht funktioniert? – glenebob

Antwort

1

Es gibt einen einfacheren Weg.

zunächst eine Klasse für enthält Daten aus einer einzigen Linie vorstellen:

class Record 
{ 
    public string Name { get; set; } 
    public string Tickets { get; set; } 
    public string Purchase { get; set; } 
    public string Date { get; set; } 
} 

In Ihrer Form1 Klasse das Folgende tun:

zwei Felder erstellen.
Eine für die Datensatzliste und eine für den aktuellen Index in der Datensatzgruppe.

Record[] soldTickets; // This will contain the file data 
int currentRecordIndex = -1; 

Erstellen Sie eine Methode, die die gesamte Datei in einem Schritt in die Plattensammlung lädt:

private void LoadRecords() 
{ 
    soldTickets = 
     File 
      .ReadAllLines(FILENAME) 
      .Select(line => 
      { 
       string[] data = line.Split(DELIM); 

       return 
        new Record() 
        { 
         Name = data[0], 
         Tickets = data[1], 
         Purchase = data[2], 
         Date = data[3] 
        }; 
      }) 
      .OrderBy(record => record.Name) 
      .ToArray(); 

    currentRecordIndex = -1; 
} 

Dann Handler Ihre Schaltfläche klicken Ereignis kann wie folgt aussehen:

private void btnView_Click(object sender, EventArgs e) 
{ 
    Record currentRecord = soldTickets.ElementAtOrDefault(++currentRecordIndex); 
    if (currentRecord == null) 
    { 
     label5.Text = "You have viewed\nall the records filed."; 
     btnView.Enabled = false; 
     return; 
    } 

    nameBox.Text = currentRecord.Name; 
    ticketsBox.Text = currentRecord.Tickets; 
    purchaseBox.Text = currentRecord.Purchase; 
    dateBox.Text = currentRecord.Date; 
}