我正在编写一个小程序来查找重复文件
我遍历目录中的每个文件
然后我将该文件的文件路径和md5hash加载到字典中(文件路径是键)
我接下来想要遍历字典中的每个值以查看是否有任何值匹配,然后在显示窗口中显示两个+键
但是我不确定如何不显示重复的发现
1a
2b
3a
4c
如果我使用一个带有键值对的每个循环,我将得到1个匹配3的条目,然后那个3匹配1
如果我有一个搜索,我可以阅读搜索字符串下面的所有内容,而不必担心(加上我相信它会更有效)
这种类型的循环是否有名称(请原谅我缺乏正式知识)
OR最好的做法是删除找到的任何字典条目吗?
答案 0 :(得分:3)
如果我理解正确,您使用哈希来决定两个文件是否相同,并且您使用哈希作为字典键。您不能在字典中包含重复的键,因此您需要Dictionary<Hash, IList<string>>
并将任何文件添加到列表中以获取每个哈希值。
答案 1 :(得分:1)
如果我理解你正在尝试做的事情:
创建一个包含文件路径和md5hash的类,并使其实现IComparable接口,以便CompareTo方法适用于md5hash。
遍历每个文件,为每个文件创建一个新对象,并将它们放入ArrayList中。然后对ArrayList进行排序。现在所有具有相同md5hash'es的文件将连续定位,因此您可以非常轻松地查看哪些文件是重复的。
答案 2 :(得分:1)
这实际上取决于您是否要保留“重复”数据而不是将其打印出来,或者您是否真的不想要字典中的数据。只有你能做出与你的计划有关的决定。
答案 3 :(得分:1)
当您阅读文件并创建其哈希时,您可以使用第二个列表将您的哈希值输入。然后插入您将检查列表是否已包含具有新值的项目。
这种方法有一点内存开销,但可以节省一些循环迭代。
答案 4 :(得分:1)
假设dict
是包含文件名作为键并且MD5哈希值作为值的字典,您可以使用以下代码显示重复文件:
var groupedByHash = from kvp in dict
group kvp by kvp.Value into grp
let count = grp.Count()
where count > 1
select grp;
foreach (IGrouping<string,KeyValuePair<string,string>> grp in groupedByHash)
{
Console.WriteLine("Hashcode : {0}", grp.Key);
foreach(KeyValuePair<string,string> kvp in grp)
{
Console.WriteLine("\tFilename = {0}", kvp.Key);
}
Console.WriteLine();
}