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