C# 中的示例“比力目次以查察它们有哪些共同的文件”使用Directory.GetFiles获取两个目次中的文件。它对文件举行排序,并比力两个排序后的列表以查察哪些文件位于第一个目次中、第二个目次中或两个目次中。有关其工作原理的具体信息,请参阅该示例。
Kuru 发表了一条批评,称 LINQ 更简单,可读性更强。此示例比力了原始代码和两种 LINQ 方法。
第一种 LINQ 方法使用 LINQ 从目次中选择文件并对其举行排序。然后像从前一样循环遍历排序后的列表,以查察哪些文件位于哪个目次中。以下代码体现了此方法怎样使用 LINQ 选择文件。
- // 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 发起的方法。)
- // 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 查询从前两个查询中选择数据,而不是从文件名数组中选择数据。如许速率要慢得多。几分钟后我就等得不耐心了,于是就克制了步伐。)
比方结果:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |