在字典中查找重复值

时间:2009-08-13 14:41:27

标签: c# dictionary loops

我正在编写一个小程序来查找重复文件

我遍历目录中的每个文件

然后我将该文件的文件路径和md5hash加载到字典中(文件路径是键)

我接下来想要遍历字典中的每个值以查看是否有任何值匹配,然后在显示窗口中显示两个+键

但是我不确定如何不显示重复的发现

1a
2b
3a
4c

如果我使用一个带有键值对的每个循环,我将得到1个匹配3的条目,然后那个3匹配1

如果我有一个搜索,我可以阅读搜索字符串下面的所有内容,而不必担心(加上我相信它会更有效)

这种类型的循环是否有名称(请原谅我缺乏正式知识)

OR最好的做法是删除找到的任何字典条目吗?

5 个答案:

答案 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();
}