在C#中测试比较目录的不同方法以查看它们有哪些共同的文件

C# 中的示例"比较目录以查看它们有哪些共同的文件"使用Directory.GetFiles获取两个目录中的文件。它对文件进行排序,并比较两个排序后的列表以查看哪些文件位于第一个目录中、第二个目录中或两个目录中。有关其工作原理的详细信息,请参阅该示例。

Kuru 发表了一条评论,称 LINQ 更简单,可读性更强。此示例比较了原始代码和两种 LINQ 方法。

第一种 LINQ 方法使用 LINQ 从目录中选择文件并对其进行排序。然后像以前一样循环遍历排序后的列表,以查看哪些文件位于哪个目录中。以下代码显示了此方法如何使用 LINQ 选择文件。

cs 复制代码
// Use LINQ twice to compare the files in each directory.
private void Compare_LinqTwice(string dir1, string dir2)
{
    // Get sorted lists of files in the directories.
    DirectoryInfo dir1_info = new DirectoryInfo(dir1);
    var dir1_query =
        from FileInfo file_info in dir1_info.GetFiles()
        orderby file_info.Name
        select file_info.Name;
    string[] file_names1 = dir1_query.ToArray();

    DirectoryInfo dir2_info = new DirectoryInfo(dir2);
    var dir2_query =
        from FileInfo file_info in dir2_info.GetFiles()
        orderby file_info.Name
        select file_info.Name;
    string[] file_names2 = dir2_query.ToArray();

    // Compare.
    ...
}

此代码为第一个目录创建了一个DirectoryInfo对象。LINQ 查询使用该对象的GetFiles方法获取表示目录文件的FileInfo对象的可枚举列表。它按FileInfo对象的名称对结果进行排序,然后选择这些名称。然后,程序调用查询的ToArray方法将结果复制到字符串数组中。

代码重复这些步骤以获得包含第二个目录的文件名的排序数组。然后像上一个示例一样比较这两个数组。

以下代码展示了第三种方法。(Kuru 建议的方法。)

cs 复制代码
// Use LINQ joins to compare the files in each directory.
private void Compare_LinqJoins(string dir1, string dir2)
{
    // Get sorted lists of files in the directories.
    DirectoryInfo dir1_info = new DirectoryInfo(dir1);
    var dir1_query =
        from FileInfo file_info in dir1_info.GetFiles()
        //orderby file_info.Name
        select file_info.Name;
    string[] file_names1 = dir1_query.ToArray();

    DirectoryInfo dir2_info = new DirectoryInfo(dir2);
    var dir2_query =
        from FileInfo file_info in dir2_info.GetFiles()
        //orderby file_info.Name
        select file_info.Name;
    string[] file_names2 = dir2_query.ToArray();

    // Compare.
    var dir1_only_query =
        from string file_name in file_names1
        where (!file_names2.Contains(file_name))
        select file_name;
    List<string> dir1_only = dir1_only_query.ToList();

    var dir2_only_query =
        from string file_name in file_names2
        where (!file_names1.Contains(file_name))
        select file_name;
    List<string> dir2_only = dir2_only_query.ToList();

    var both_query =
        from string file_name in file_names1
        where (file_names2.Contains(file_name))
        select file_name;
    List<string> both = both_query.ToList();
}

此方法使用DirectoryInfo对象和 LINQ 来获取包含目录文件的数组(如前所述)。此程序不再循环遍历名称数组,而是使用三个 LINQ 查询来选择仅存在于第一个目录中、仅存在于第二个目录中或同时存在于两个目录中的文件。

所有三种方法都将结果存储在List中,而不是像原始示例那样将结果显示在DataGridView中。该程序对每种方法运行 10 次试验,以获得足够有意义的时间。

如果你仔细看文章顶部的图片,你会发现原始方法是最快的。第二种使用 LINQ 选择文件的方法花费的时间大约长 50%。

第三种方法使用 LINQ 来确定哪些文件位于哪些目录中,耗时几乎是第一种方法的 10 倍。它当然更简单,而且您可能会发现它比第一种方法更容易阅读,但它要慢得多。

(我也尝试使用第三种方法,但最后三个 LINQ 查询从前两个查询中选择数据,而不是从文件名数组中选择数据。这样速度要慢得多。几分钟后我就等得不耐烦了,于是就停止了程序。)

例如结果:

相关推荐
平常心的技术小牛3 小时前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆3 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
余额瞒着我当琳5 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪5 小时前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw6 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠6 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
SL-staff7 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
曹牧7 小时前
C#:数字的定义和表示方式
算法·c#
SomeB1oody7 小时前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程
进制树8 小时前
【飞控开发实战·⑲】ROS2无人机开发环境搭建:Jazzy安装、工作空间与hello_drone节点实战
开发语言·安全·无人机·课程设计