【问题标题】:How to compare Dictionary<string, string[]>?如何比较 Dictionary<string, string[]>?
【发布时间】:2015-07-15 12:12:52
【问题描述】:

我发现了这个帖子:Comparing 2 Dictionary<string, string> Instances

它与我想要做的足够接近,所以我认为它应该可以工作。我尝试了选择的答案和第二个答案,在我的情况下它们总是返回 false。

我正在尝试比较一对字典,然后比较第二对。 activeForm 和 activeFiles 应该相等。 archivedForm 和 archivedFiles 应该相等。


不知道我还能尝试什么。有什么想法吗?

【问题讨论】:

  • 字典的值也需要相等吗?我的意思是数组的值也需要相同吗?
  • 键和值应该相同,是的。
  • 您所要做的就是更改这些答案比较值的方式。查看Enumerable.SequenceEqual 比较数组。

标签: c# .net-4.0


【解决方案1】:
public class StringArrayEqualityComparer : IEqualityComparer<string[]>
{
    public bool Equals(string[] x, string[] y)
    {
        return x.OrderBy(z => z).SequenceEqual(y.OrderBy(z => z));
    }
    public int GetHashCode(string[] obj)
    {
        return obj.GetHashCode();
    }
}

你只需要实现IEqualityComparer&lt;T&gt;,然后使用Comparing 2 Dictionary<string, string> Instances中回答的静态方法

【讨论】:

  • 这不起作用,因为数组可以作为集合相等,但顺序不同。这将使 SequenceEqual 断言失败。
  • @shay__:说它“不起作用”具有误导性:是否应考虑顺序取决于 OP 对相等性的定义。 (数组是序列,所以我假设排序 should 会影响相等性。如果我不关心排序,那么我会尝试通过使用 ISet&lt;string&gt; 而不是 @ 来使其明确987654325@.)
【解决方案2】:

有很多方法可以做到这一点。例如:

Dictionary 将其 Keys 公开为一个集合。您可以先比较两个键集合。如果它们相等,则迭代字典并确保值也相等:

    private bool AreDictsEqual(IDictionary<string, string[]> d1, IDictionary<string, string[]> d2)
    {
        if (d1.Keys.OrderBy(p => p).SequenceEqual(d2.Keys.OrderBy(p => p)))
        {
            foreach (var item in d1)
            {
                if (!d2[item.Key].OrderBy(p => p).SequenceEqual(item.Value.OrderBy(p => p)))
                {
                    return false;
                }
            }
        }
        return false;
    }

当然还有更有效的方法,但这只是一个例子。

【讨论】:

  • 最后应该是return true 吗?虽然它可能效率不高,但这些字典很少会超过几个键值对。
  • SequenceEqual 仅当键的顺序相同时才为真。我不确定是否保证订购这些钥匙。
  • @juharr 好点。我相信他们会的,他们的字典只是文本文件和内容的集合(或来自表单本身的 2 个文本值)。文件列表按创建日期的顺序检索,表单上的文本值是在加载时从这些文件生成的。基本上我只是想看看表格是否发生了变化。
  • @sab669 其实我刚刚测试过,键似乎按照它们添加到字典中的顺序,所以SequenceEqual 不起作用。
  • @juharr 虽然我希望它们按哈希码排序,并且仅在插入顺序发生冲突的情况下。确定吗?
【解决方案3】:

比较值的 IEqualityComparer 的代码是什么?您需要比较两个数组的每个条目。直接比较数组会产生错误,因为引用可能不同,即使条目可能相同。

【讨论】:

  • valueComparer = {System.Collections.Generic.ObjectEqualityComparer&lt;string[]&gt;}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多