Listen vergleichen



  • wie kann ich am schnellsten zwei Listen miteinander vergleichen
    und mir dabei die unterschiedlichen Dateien anzeigen lassen?

    habe das ganze bis jetzt so gelöst:

    public void CompareFolder()
            {
                foreach (FileSystemInfo files1 in this.folder1)
                    foreach (FileSystemInfo files2 in this.folder2)
                        if (files1.Name.Equals(files2.Name))
                            if (!CompareFile(files1.FullName, files2.FullName))
                            {
                                Console.WriteLine(files1.Name);
                                break;
                            }
            }
    

    Allerdings riecht mir das sehr nach einer Laufzeit von ca n² 🙂

    freue mich über eure Hilfe
    mfg
    ???



  • Schau dir mal Except und Intersect an, sind Erweiterungsmethoden.



  • Danke!

    Leider bekomme ich es aber nicht zum laufen...

    public void CompareFolder()
            {
                IEnumerable<FileSystemInfo> both = folder1.Intersect(folder2);
    
                foreach (FileSystemInfo same in both)
                    Console.WriteLine(same.Name);
            }
    

    Es wird nur eine Ausgabe gemacht und diese ist nicht mal ein Name
    sondern eine Zahl...



  • Liegt vermutlich daran, dass meine erezuge Schnittmenge (bei foreach)
    aus den Namen entsteht...



  • Benutze die Überladung der Except-Methode, bei der du auch den IEqualityComparer angeben kannst, d.h. du mußt eine eigene Klasse implementieren

    class FileInfoEqualityComparer : IEqualityComparer<FileInfo>
    {
      bool Equals(FileInfo f1, FileInfo f2)
      {
        return f1.Name == f2.Name;
      }
    
      int GetHashCode(FileInfo fi)
      {
        return fi.GetHashCode();
      }
    }
    

    Und nun eine Instanz davon übergeben:

    IEnumerable<FileSystemInfo> both = folder1.Except(folder2, new FileInfoEqualityComparer());
    

    (habe ich jetzt aus dem Kopf so hingeschrieben, du müßtest evtl. also noch ein paar kleine Anpassungen vornehmen 😉



  • top sache!!!
    Danke für die Hilfe 🙂


Anmelden zum Antworten