Verschachtelt mit Anweisungen in C #
Ich bin an einem Projekt arbeiten. Ich habe so vergleichen Sie den Inhalt von zwei Dateien, und sehen, ob Sie zueinander passen genau.
Bevor eine Menge von Fehler-überprüfung und-Validierung, mein Erster Entwurf ist:
DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "\\TestArea\\");
FileInfo[] files = di.GetFiles(filename + ".*");
FileInfo outputFile = files.Where(f => f.Extension == ".out").Single<FileInfo>();
FileInfo expectedFile = files.Where(f => f.Extension == ".exp").Single <FileInfo>();
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
{
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
if (outFile.ReadLine() != expFile.ReadLine())
{
return false;
}
}
return (outFile.EndOfStream && expFile.EndOfStream);
}
}
Es scheint ein wenig seltsam für geschachtelte using
Aussagen.
Gibt es einen besseren Weg, dies zu tun?
InformationsquelleAutor der Frage SBurris | 2009-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der bevorzugte Weg, dies zu tun ist, nur eine öffnende Klammer
{
nach der letztenusing
- Anweisung wie folgt:InformationsquelleAutor der Antwort SLaks
Wenn die Objekte der gleichen Typ können Sie die folgenden
InformationsquelleAutor der Antwort Gavin H
Wenn die
IDisposable
s vom gleichen Typ sind, können Sie Folgendes tun:Auf der MSDN-Seite auf
hat die Dokumentation in dieser Sprache verfügen.
Können Sie Folgendes tun, ob oder nicht die
IDisposable
s sind vom gleichen Typ:InformationsquelleAutor der Antwort jason
wenn Sie nichts dagegen haben, deklarieren Sie die Variablen für Ihre Verwendung zu blockieren, bevor Sie den using-block, konnte Sie erklären Sie alle in der gleichen Anweisung verwenden.
So, x und y sind nur Platzhalter-Variablen vom Typ IDisposable für die using-block verwenden, und verwenden Sie t und u im Quellcode. Ich dachte, ich würde erwähnen.
InformationsquelleAutor der Antwort Botz3000
Wenn Sie wollen, vergleichen Sie die Dateien effizient, nicht verwenden StreamReaders, und dann die aufzuhalten der Benutzung nicht nötig - Sie können low-level-stream liest, um zu ziehen in Puffern von Daten zu vergleichen.
Können Sie auch Dinge vergleichen, wie die Größe der Datei zunächst schnell zu erkennen, verschiedene Dateien zu speichern, Sie müssen, um alle Daten Lesen zu können.
InformationsquelleAutor der Antwort Jason Williams
Die using-Anweisung funktioniert aus der IDisposable-Schnittstelle, so dass eine weitere option könnte sein, die irgendeine Art von composite-Klasse, die IDisposable implementiert und hat Referenzen zu allen von der IDisposable-Objekten, die Sie normalerweise in Ihrem using-Anweisung. Die Kehrseite davon ist, dass müssen Sie deklarieren Sie Ihre Variablen erste und außerhalb der Reichweite für Sie nützlich zu sein innerhalb des using-Blocks, die mehr Zeilen code als einige der anderen Vorschläge erfordern würde.
Konstruktor für DisposableCollection ist ein params-array in diesem Fall, damit können Sie Futter in so viele wie Sie möchten.
InformationsquelleAutor der Antwort jpierson
Können Sie auch sagen:
Aber einige Leute finden, dass schwer zu Lesen. BTW, wie eine Optimierung zu deinem problem, warum nicht Sie überprüfen, dass die Datei-Größen sind die gleiche Größe ersten, bevor Sie gehen Zeile für Zeile?
InformationsquelleAutor der Antwort aquinas
Könnte man weglassen der Klammern auf alle, aber die inner-die meisten mit:
Ich denke, das ist übersichtlicher, als mehrere der gleichen Art in der gleichen Verwendung, wie andere vorgeschlagen haben, aber ich bin sicher, viele Leute denken, dass dies verwirrend
InformationsquelleAutor der Antwort yoyoyoyosef
Es ist nichts sonderbares daran.
using
ist ein Kürzel Art und Weise der Sicherstellung der Entsorgung des Objekts sobald der code-block beendet ist. Wenn Sie eine Wegwerf-Objekt im äußeren block, dass der innere block verwenden muss, ist dies durchaus akzeptabel.Edit: Zu langsam auf die Eingabe, um zu zeigen, konsolidierte code-Beispiel. +1 zu allen anderen.
InformationsquelleAutor der Antwort womp
Und einfach auf die Klarheit, in diesem Fall, da jede nachfolgende Anweisung ist eine einzelne Anweisung, (und nicht blockieren), kann man auch weglassen aller Klammern :
InformationsquelleAutor der Antwort Charles Bretana
Können Sie mehrere Einweg-Objekte in einer using-Anweisung durch Kommata getrennt werden:
InformationsquelleAutor der Antwort codymanix
Diese kommen Zeit zu Zeit, wenn ich den code als gut. Sie könnte in Erwägung ziehen, verschieben Sie den zweiten using-Anweisung in einer anderen Funktion?
InformationsquelleAutor der Antwort obelix
Sind Sie auch gefragt, ob es einen besseren Weg gibt, um zu vergleichen, um Dateien?
Ich bevorzuge die Berechnung einer CRC oder MD5 für die Dateien und vergleichen diese.
Beispielsweise können Sie mit der folgenden extension Methode:
Sobald Sie dies getan haben, ist es ziemlich einfach, um Dateien zu vergleichen:
Konnte man mit dem eingebauten System.Sicherheit.Die Kryptographie.MD5 Klasse,
aber der berechnete hash wird ein byte[] so würden Sie immer noch haben, vergleichen Sie diese beiden arrays.
InformationsquelleAutor der Antwort TimothyP
Auch, wenn Sie bereits wissen, die Wege, es gibt keinen Punkt, ist die scan-Verzeichnis.
Stattdessen würde ich empfehlen, so etwas wie dieses:
Weg.Kombinieren
wird fügen Sie einen Ordner-oder Dateinamen, einen Pfad und stellen Sie sicher, dass es genau einen backslash zwischen Pfad und den Namen.- Datei.OpenText
wird, öffnen Sie eine Datei, und erstellen Sie eineStreamReader
.Durch ein Präfix eines Strings mit @, können Sie vermeiden, zu entkommen jeden backslash (zB
@"a\b\c"
)InformationsquelleAutor der Antwort SLaks
Kann ich denke ich gefunden haben, die syntaktisch sauberer Weg, deklarieren Sie diese using-Anweisung, und es scheint für mich arbeiten? mit var als Ihre Art in der using-Anweisung anstelle von IDisposable scheint dynamisch infer type auf beide Objekte und es mir erlaubt zu instanziieren meine beiden Objekte und rufen deren Eigenschaften und Methoden der Klasse Sie zugeordnet sind, wie in
using(var uow = new UnitOfWorkType1(), uow2 = new UnitOfWorkType2()){}.
Wenn jemand weiß, warum dies nicht richtig ist, bitte lassen Sie mich wissen,
InformationsquelleAutor der Antwort Caleb