>我的filePaths列表(将是一个txtFile,其中包含一个文件路径列表.转换为hashset)
>他们的filePaths列表(将动态读取并生成一个hashset)
public static HashSet<string> ToHashSet(this string rootDirectory) { const string searchPattern = "*.*"; string[] files = Directory.GetFiles(rootDirectory,searchPattern,SearchOption.AllDirectories); return new HashSet<string>(files); }
所以我将MyHashSet与TheyHashSet进行比较.
只是在这里有点偏执,只想仔细检查是否除了我认为它做的.
Except =“给定2个散列集比较所有文件路径,如果在MyList中找不到其中的那些,则产生结果”
我写了一个小测试,证明除了找到差异.
这是比较大文件的正确和最佳方法吗?
虚拟ProofOfConcept
class Program { static void Main(string[] args) { const string rootDirectory = @"C:\Tests"; HashSet<string> myHashSet= CreateDummyHashSet(rootDirectory,10); HashSet<string> theirHashSet= CreateDummyHashSet(rootDirectory,12); IEnumerable<string> result = theirHashSet.Except(myHashSet); foreach (var file in result) { Console.WriteLine(file); } Console.Read(); } public static HashSet<string> CreateDummyHashSet(string rootDirectory,int numberOfFiles) { var dummyHashSet = new HashSet<string>(); const string extension = ".txt"; const string fileName = "File"; for (int i = 0; i < numberOfFiles; i++) { string fullfileName = string.Format("{0}{1}{2}",fileName,i,extension); string path = Path.Combine(rootDirectory,fullfileName); dummyHashSet.Add(path); } return dummyHashSet; } }
解决方法
Is this correct and best way to compare large files?
您不是在比较大文件,而只是比较它们的名称. Hashset非常适合在集合上执行此操作.
我不建议使用sbrauen提出的建议
var result = theirHashSet.Where(x => !myHashSet.Contains(x));
因为它必须对m个条目进行n次操作,n和m分别是其HashSet和myHashSet中的条目数. Hashset应该在这些操作中表现更好.实际上比ExceptWith更好的是,因为Except是IEnumerable的扩展方法,而ExceptWith是HashSet中的方法<>.
编辑:
不同之处在于Except返回一个新的IEnumerable集合,而ExceptWith将从其HasSet中删除相同的条目.另外,ExceptWith更快,因为它知道HashTable的内部,Except只是一种扩展方法.
这是引擎盖下的样子
除了
Set<TSource> set = new Set<TSource>(comparer); foreach (TSource tSource in second) { set.Add(tSource); } foreach (TSource tSource1 in first) { if (!set.Add(tSource1)) { continue; } yield return tSource1; }
ExceptWith
foreach (T t in other) { this.Remove(t); }
你可以立即看到差异.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。