用于查找差异的 lambda 表达式
lambda expression for finding differences
我正在尝试比较 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
树中没有添加任何内容,因为所有内容都已经存在
我尝试了这两种方法:
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;
}
这是最基本的工作,但我看到每个文件夹都与更多的文件夹进行了比较。
所以我尝试切换到 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
注意:第二个文件夹并不总是有需要添加的文件夹,在 otherFolder 上增加 sublevels
/ maxfolders
以增加这种可能性发生
我想我通过以下方式修复了它:
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);
}
}
}
仍在检查,但看起来它在工作
我正在尝试比较 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
树中没有添加任何内容,因为所有内容都已经存在
我尝试了这两种方法:
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;
}
这是最基本的工作,但我看到每个文件夹都与更多的文件夹进行了比较。
所以我尝试切换到 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
注意:第二个文件夹并不总是有需要添加的文件夹,在 otherFolder 上增加 sublevels
/ maxfolders
以增加这种可能性发生
我想我通过以下方式修复了它:
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);
}
}
}
仍在检查,但看起来它在工作