我们正在传输大量文档/图像,在实际将这些文档保存到 sql server 之前,我想比较 2 个文件列表。
我的文件路径列表(将是一个包含文件路径列表的 txtFile。转换为哈希集)
他们的文件路径列表(将即时读取并生成哈希集)
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 和 TheirHashSet。
这里有点偏执,只想仔细检查 except 是否按照我的想法行事。
Except="给定 2 个哈希集比较所有文件路径,如果 TheirList 中的那些在 MyList 中找不到则产生结果"
我写了一个小测试来证明 except 确实找到了差异。
这是比较大文件的正确且最好的方法吗?
虚拟概念验证
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 是条目的数量theirHashSet
和 myHashSet
分别。 Hashset 在执行这些操作时应该表现更好。那么实际上更好的是Except
是ExceptWith
因为Except
是IEnumerable
的扩展方法而ExceptWith
是 HashSet<>
中的一种方法.
编辑:
区别在于Except
返回一个新的 IEnumerable
收集而 ExceptWith
将从 theirHashSet
中删除相同的条目.还有 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;
}
异常(exception)
foreach (T t in other)
{
this.Remove(t);
}
您可以立即看到差异。
关于c# - 仅比较 FilesNames 而不是内容我的解决方案是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20310072/