c# - 仅比较 FilesNames 而不是内容我的解决方案是否正确?

标签 c# hashset

我们正在传输大量文档/图像,在实际将这些文档保存到 sql server 之前,我想比较 2 个文件列表。

  1. 我的文件路径列表(将是一个包含文件路径列表的 txtFile。转换为哈希集)

  2. 他们的文件路径列表(将即时读取并生成哈希集)

    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 操作,nm 是条目的数量theirHashSetmyHashSet分别。 Hashset 在执行这些操作时应该表现更好。那么实际上更好的是ExceptExceptWith因为ExceptIEnumerable的扩展方法而ExceptWithHashSet<> 中的一种方法.

编辑:

区别在于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/

相关文章:

c# - 我应该为单元测试访问 protected 方法吗?

c# - 空用户输入异常c#

c# - 无法打开文件流进行读取,但我仍然可以复制文件?

c# - 在 HashSet<T> 中是否包含线程安全

c# - 需要从多个词典<Datetime,double> 中获取一组唯一的键

java - 如何重写hashcode和equals方法以避免在java中的HashSet中添加重复的字符串?

c# - 在我的项目中查找 namespace 依赖项的工具?

c# 带参数的http post 数据并保存到mysql

rust - 从 HashSet 中获取具有最低值的元素?

Java HashSet 同步查询