2009-08-13 3 views
1

Ich bin ein kleines Programm zu schreiben doppelte DateienFinden doppelte Werte in einem dictonary

ich durch jede Datei in einem Verzeichnis durchlaufen finden

dann laden i den Dateipfad und die md5hash dieser Datei in eine Wörterbuch (Dateipfad ist der Schlüssel)

ich als nächstes durch jeden Wert im Wörterbuch gehen will, um zu sehen, ob irgendwelche Werte dann die beide + Anzeige Einstimmungsschlüssel in einem Anzeigefenster

aber im nicht sicher, wie man es nicht angezeigt werden doppelte Ergebnisse

1a 
2b 
3a 
4c 

Wenn ich ein für jede Schleife mit dem Schlüsselwertpaar verwenden würde ich Einträge bekommt für 1 match 3 und dann der 3 Match 1

Wenn ich eine Suche, die ich alles unter dem Such lesen konnte String und müssen sich keine Sorgen über das (plus ich glaube, es wäre effizienter)

gibt es einen Namen für diese Art von Schleife (bitte meinen Mangel an formalen know entschuldigen)

OR wäre die beste Praxis um irgendwelche Wörterbucheinträge zu entfernen, wie sie gefunden werden?

Vielen Dank für Ihre Hilfe

+0

aus Neugier, wie Sie wissen, eine Datei ist dupliziert? Nur nach Dateiname oder nach Inhalt? –

+0

Ich nehme den MD5 Hash jeder Datei – Crash893

Antwort

1

Unter der Annahme, dass dict ist ein Wörterbuch, das den Dateinamen als Schlüssel und den MD5-Hash als Wert enthält, können Sie den folgenden Code verwenden, um doppelte Dateien anzuzeigen:

var groupedByHash = from kvp in dict 
        group kvp by kvp.Value into grp 
        let count = grp.Count() 
        where count > 1 
        select grp; 

foreach (IGrouping<string,KeyValuePair<string,string>> grp in groupedByHash) 
{ 
    Console.WriteLine("Hashcode : {0}", grp.Key); 
    foreach(KeyValuePair<string,string> kvp in grp) 
    { 
     Console.WriteLine("\tFilename = {0}", kvp.Key); 
    } 
    Console.WriteLine(); 
} 
1

Wenn ich verstehe, was Sie versuchen, richtig zu tun:

Erstellen Sie eine Klasse den Dateipfad und md5hash enthält, und es die IComparable-Schnittstelle, dass die CompareTo so machen implementieren Methode funktioniert auf dem MD5hash.

Iterieren Sie durch jede Datei, erstellen Sie für jedes ein neues Objekt und werfen Sie sie in eine ArrayList. Dann sortiere die ArrayList. Jetzt werden alle Dateien mit den gleichen md5hash'es nacheinander gefunden, so dass Sie sehr leicht sehen können, welche Dateien Duplikate sind.

+0

Wie erstelle ich eine kompatible Schnittstelle? – Crash893

3

Wenn ich Sie richtig verstehe, verwenden Sie den Hash, um zu entscheiden, ob zwei Dateien identisch sind, und Sie verwenden den Hash als Wörterbuchschlüssel. Sie können keine doppelten Schlüssel in einem Wörterbuch haben, daher sollten Sie einen Dictionary<Hash, IList<string>> haben und für jeden Hash-Wert irgendwelche Dateien zur Liste hinzufügen.

+0

Er verwendet den Pfad als Schlüssel, aber Sie haben einen besseren Weg gefunden, die Duplikate hier zu zählen. – grenade

+1

Wenn Sie Lees Vorschlag von Hashes als Schlüssel und Pfade als Werte verwenden, wird die Zählung für Sie bereits durchgeführt, wenn das Wörterbuch gefüllt ist. – grenade

+0

Das ist eine gute Idee – Crash893

1

Es hängt wirklich davon ab, ob Sie die 'doppelten' Daten behalten und sie einfach nicht ausdrucken wollen oder ob Sie die Daten wirklich nicht im Wörterbuch haben wollen. Tahts eine Entscheidung, die Sie nur in Bezug auf Ihr Programm treffen können.

1

Wenn Sie die Dateien lesen und ihre Hashes erstellen, können Sie einfach eine zweite Liste verwenden, in die Sie Ihre Hashwerte werfen. Vor dem Einfügen würden Sie dann prüfen, ob die Liste bereits ein Element mit dem neuen Wert enthält.

Dieser Ansatz hat einen geringen Speicheraufwand, spart jedoch einige Schleifeniterationen.