我需要一种方法来比较目录中的文件。 首先,我选择一个rootfolder来获取其中的所有文件。
IEnumerable<FileInfo> fileList = rootDir.GetFiles("*.*", SearchOption.AllDirectories);
我的第一次尝试是使用两个foreach循环
foreach (FileInfo file1 in fileList)
{
foreach (FileInfo file2 in fileList)
{
if (file2.FullName != file1.FullName && file2.Length == file1.Length)
{
tb_result.AppendText("\r\n" + file1.FullName + "\r\n" + file2.FullName + "\r\n");
}
}
现在我必须使用另一个列表来保存已使用的文件名,以防止我的应用程序找到相同的已使用文件。
示例:
该方法在rootdir中找到test1,在subdir中找到test1。稍后它会在subdir中找到test1,在rootdir中找到test1并将其打印出来。
有没有办法从列表中删除已使用的元素,还是有更好的方法将目录与子目录进行比较?
感谢
答案 0 :(得分:1)
目前还不清楚你在寻找什么,但你可能会:
// We group by size, and we take only the groups that have multiple files
var grouped = fileList.GroupBy(x => x.Length).Where(x => x.Count() > 1);
// Each group is "keyed"/"grouped" by size
foreach (var group in grouped)
{
Console.WriteLine("Size: {0}", group.Key);
foreach (var file in group)
{
Console.WriteLine(" {0}", file.FullName);
}
}
请注意,虽然您的方法是O(n^2)
(每个文件相互比较),甚至Guillaume的一个是O(n^2)
(但更短,因为他做 n *(n-1) )/ 2 比较或类似的东西),这个应该是O(n)
(因为如果GroupBy
内部使用哈希表,O(n)
应该是{{1}})
答案 1 :(得分:0)
更改双循环以避免多次检查相同的项目。
FileInfo[] fileList = rootDir.GetFiles("*.*", SearchOption.AllDirectories).ToArray();
for (int i = 0; i < fileList.Length - 1; i++)
{
FileInfo file1 = fileList[i];
for (j = i + 1; j < fileList.Length; j++)
{
FileInfo file2 = fileList[j];
if (file2.Length == file1.Length)
{
tb_result.AppendText("\r\n" + file1.FullName + "\r\n" + file2.FullName + "\r\n");
}
}