C# 如何比较字典<;字符串,字符串[]>;?

C# 如何比较字典<;字符串,字符串[]>;?,c#,.net-4.0,C#,.net 4.0,我发现这个帖子: 它离我要做的已经足够近了,所以我认为它应该能起作用。我尝试了所选答案和第二个答案,在我的情况下,它们都返回false 我试着比较一对字典和第二对字典。activeForm和activeFiles应该相等。archivedForm和ArchivedFile应该相等 不知道我还能尝试什么。有什么想法吗?有很多方法。例如: 字典将其键公开为一个集合。可以首先比较两个密钥集合。如果它们相等,则迭代字典并确保值也相等: private bool AreDictsEqua

我发现这个帖子:

它离我要做的已经足够近了,所以我认为它应该能起作用。我尝试了所选答案和第二个答案,在我的情况下,它们都返回false

我试着比较一对字典和第二对字典。activeForm和activeFiles应该相等。archivedForm和ArchivedFile应该相等



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

有很多方法。例如:

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

    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;
    }
private bool aredicqual(IDictionary d1,IDictionary d2)
{
if(d1.Keys.OrderBy(p=>p).SequenceEqual(d2.Keys.OrderBy(p=>p)))
{
foreach(d1中的var项目)
{
如果(!d2[item.Key].OrderBy(p=>p).SequenceEqual(item.Value.OrderBy(p=>p)))
{
返回false;
}
}
}
返回false;
}

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

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

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

    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;
    }
private bool aredicqual(IDictionary d1,IDictionary d2)
{
if(d1.Keys.OrderBy(p=>p).SequenceEqual(d2.Keys.OrderBy(p=>p)))
{
foreach(d1中的var项目)
{
如果(!d2[item.Key].OrderBy(p=>p).SequenceEqual(item.Value.OrderBy(p=>p)))
{
返回false;
}
}
}
返回false;
}

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

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

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

公共类StringArrayQualityComparer:IEqualityComparer
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();
    }
}
{ 公共布尔等于(字符串[]x,字符串[]y) { 返回x.OrderBy(z=>z).SequenceEqual(y.OrderBy(z=>z)); } public int GetHashCode(字符串[]obj) { 返回obj.GetHashCode(); } }
您只需要实现
IEqualityComparer,
然后使用公共类StringArrayEqualityComparer:IEqualityComparer中回答的静态方法 { 公共布尔等于(字符串[]x,字符串[]y) { 返回x.OrderBy(z=>z).SequenceEqual(y.OrderBy(z=>z)); } public int GetHashCode(字符串[]obj) { 返回obj.GetHashCode(); } }

您只需执行
IEqualityComparer,
然后使用

中回答的静态方法词典的值是否也需要相等?我的意思是数组的值也需要相同吗?键和值应该相同,是的。你所要做的就是改变这些答案如何比较值。检查比较数组。字典的值也需要相等吗?我的意思是数组的值也需要相同吗?键和值应该相同,是的。你所要做的就是改变这些答案如何比较值。检查比较数组。
valueComparer={System.Collections.Generic.ObjectEqualityComparer}
valueComparer={System.Collections.Generic.ObjectEqualityComparer}
是否应该是
返回true
?虽然可能效率不高,但这些字典很少会超过几个键值对。
SequenceEqual
仅在键顺序相同时才为真。我不确定这些钥匙是否能保证订购。@juharr说得好。我相信他们会的,他们的字典只是一个文本文件和内容的集合(或来自表单本身的两个文本值)。文件列表是按创建日期的顺序检索的,表单上的文本值是在加载时从这些文件生成的。基本上,我只是想看看表单是否发生了变化。@sab669实际上我刚刚测试过,键似乎是按照它们添加到字典中的顺序排列的,所以
SequenceEqual
不起作用。@juharr尽管我希望它们是按照散列码排序的,并且只有在发生冲突时才按照插入顺序排序。你确定吗?这应该是
返回true
的结尾吗?虽然可能效率不高,但这些字典很少会超过几个键值对。
SequenceEqual
仅在键顺序相同时才为真。我不确定这些钥匙是否能保证订购。@juharr说得好。我相信他们会的,他们的字典只是一个文本文件和内容的集合(或来自表单本身的两个文本值)。文件列表是按创建日期的顺序检索的,表单上的文本值是在加载时从这些文件生成的。基本上,我只是想看看表单是否发生了变化。@sab669实际上我刚刚测试过,键似乎是按照它们添加到字典中的顺序排列的,所以
SequenceEqual
不起作用。@juharr尽管我希望它们是按照散列码排序的,并且只有在发生冲突时才按照插入顺序排序。你确定吗?这行不通,因为数组可以作为集合相等,但顺序不同。这将使SequenceEqual断言失败。@shay_u;:说它“行不通”是误导性的:订单是否应该是co