2015-04-02 29 views
0

我试图比较2个文件夹结构并找到不在其他树中的最高文件夹。用于查找差异的lambda表达式

,但给出的例子时,这将可能会更清楚: 说,我们有这2个文件夹:

Fo1: sub 0 (fo: 3) 
> Fo: sub 0 sub 0 (fo: 2) 
> > Fo: sub 0 sub 0 sub 0 (fi: 3) 
> > Fo: sub 0 sub 0 sub 1 (fi: 3) 
> Fo: sub 0 sub 1 (fo: 1) 
> > Fo: sub 0 sub 0 sub 0 (fi: 1) 
> Fo: sub 0 sub 2 (fo: 2) 
> > Fo: sub 0 sub 1 sub 0 (fi: 2) 
> > Fo: sub 0 sub 1 sub 1 (fi: 1) 

Fo2: sub 0 (fo: 3) 
> Fo: sub 0 sub 0 (fo: 1) 
> > Fo: sub 0 sub 0 sub 0 (fi: 3) 
> Fo: sub 0 sub 1 (fo: 3) 
> > Fo: sub 0 sub 1 sub 0 (fi: 1) 
> > Fo: sub 0 sub 1 sub 1 
> > Fo: sub 0 sub 1 sub 2 (fi: 4) 
> Fo: sub 0 sub 2 (fo: 2) 
> > Fo: sub 0 sub 2 sub 0 (fi: 1) 
> > Fo: sub 0 sub 2 sub 1 

那么结果将是:

Fo: sub 0 sub 1 sub 1 
Fo: sub 0 sub 1 sub 2 
Fo: sub 0 sub 2 

因此,例如sub 0 sub 2 sub 0和没有添加sub 0 sub 2 sub 1,因为已经添加了根目录。并有来自sub 0 sub 0树添加什么,因为一切都已经在那里

我想这2种方法:

private static bool compareFolders(Folder folder1, Folder folder2, List<Folder> newFolders, int index = 0) { 
    // if has a folder that is same or is in root 
    if (folder1.title == folder2.title) { 
     Console.WriteLine("Same: " + folder1.title); 

     // check for childs 
     index++; 
     if (folder1.childs != null) { 
      foreach (Folder sub in folder1.childs) { 
       if (folder2.childs != null) { 
        foreach (Folder sub2 in folder2.childs) { 
         compareFolders(sub, sub2, newFolders, index); 
        } 
       } 
      } 
     } 
     return true; 
    } 
    // moment there false, check if root doesn't 
    if (folder2.childs != null && folder2.childs.Count > 0) 
     // folder 2 has folder that folder 1 doesn't have 
     newFolders.AddRange(folder2.childs); 
    return false; 
} 

这是olmost的工作,但我看到每个文件夹进行了比较详细的文件夹,那么它应该。

所以我尝试切换到lambda,但无法弄清楚如何做到这一点。这是我的了:

private static void compareFolders2(Folder folder1, Folder folder2, List<Folder> newFolders, int index = 0) { 
    if (folder2.childs != null && folder2.childs.Count > 0) { 
     if (folder1.childs != null && folder1.childs.Count > 0) { 
      var similarFolders = folder1.childs.FindAll(f => folder2.childs.Select(f2 => f2.title).ToList().Contains(f.title)); 
      if (similarFolders.Count > 0) { 
       foreach (Folder folder in similarFolders) { 
        compareFolders2(folder, folder2.childs.Find(f => f.title == folder.title), newFolders); 
       } 
      } else { 
       newFolders.AddRange(folder2.childs); 
      } 
     } 
    } 
} 

,如果你想尝试一些东西,我做了对测试文件夹结构的某些生成方法一个简单的C#控制台应用程序和打印一样的例子 https://gist.github.com/cskiwi/d2e5002af98da6982971

注意:不能总是做第二个文件夹也需要被添加的文件夹,增加otherFoldersublevels/maxfolders使这个更有可能发生

回答

0

觉得我这样做固定它:

private static void compareFolders(Folder folder1, Folder folder2, List<Folder> newFolders) { 
     if (folder2.childs != null) { 
      if (folder1.childs != null) { 
       // check for folder 2 childs not in folder 1 
       newFolders.AddRange(folder2.childs.FindAll(f => !folder1.childs.Select(f2 => f2.title).ToList().Contains(f.title))); 
       // for similar folders go one deeper 
       folder1.childs.FindAll(f => folder2.childs.Select(f2 => f2.title).ToList().Contains(f.title)).ForEach(f1 => compareFolders3(f1, folder2.childs.Find(f2 => f2.title == f1.title), newFolders)); 
      } else { 
       // folder 1 doesn't have childs so add all of folder2 
       newFolders.AddRange(folder2.childs); 
      } 
     } 
    } 

不过检查出来,但看喜欢它的工作