c# - 如何检查两个字典是否包含相同的值?

标签 c# linq dictionary equality

我知道了,但是它太短了,我几乎可以肯定我遗漏了什么:

public static bool ValueEquals<TKey, TValue>
    (this IDictionary<TKey, TValue> source, IDictionary<TKey, TValue> toCheck)
{
    if (object.ReferenceEquals(source, toCheck))
        return true;
    if (source == null || toCheck == null || source.Count != toCheck.Count)
        return false;
    return source.OrderBy(t => t.Key).SequenceEqual(toCheck.OrderBy(t => t.Key));
}

所以基本上,如果它们具有相同的引用,则返回 true。如果它们中的任何一个为 null 或者它们的计数不同,则返回 false。如果序列(先按键再按值排序)相同,则返回。我一定遗漏了什么,因为它太短了,不够好。

最佳答案

是的,只要所有键都实现 IComparable 并且键和值都有一个 Equals 方法来比较您希望它比较的内容,您的代码就可以工作.如果键或值没有对这些方法进行适当的实现,那么这将不起作用。

您的方法也没有为要传入的自定义 IComparerIEqualityComparer 对象提供功能,以解决对象没有理想实现的情况这些方法之一。我们不能说在您的具体情况下这是否是一个问题。

您的解决方案还需要对所有值进行排序,这比集合等于的其他可能实现方式效率稍低,但不会显着更糟,所以如果您没有特别大的值集合应该不是一个大问题。

一种功能与您的方法相当但速度有所提高的方法是(保留您的前两项检查):

return !source.Except(toCheck).Any();

由于此方法不依赖于排序,它还提供了不需要 TKey 来实现 IComparable 的好处。

此方法和您的方法都有效的一个关键原因是 KeyValuePair 覆盖了它对 EqualsGetHashCode 的定义以基于它自己的引用,而是基于它包装的键和值。如果键和值都相等,则两个 KeyValuePairs 相等,哈希码包含键和值的哈希码。

关于c# - 如何检查两个字典是否包含相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944458/

相关文章:

c# - 指定的包含路径无效。 EntityType '*Propiedad' 未声明名称为 'Nombre' 的导航属性

c# - Xamarin 将 XCode 移植到 CSharp

c# - 使用 Linq to sql 将 List<String> 插入到 ntext 字段

c# - Read 和 Load 的语义差异

json - 无法将类型 'Swift.Dictionary<Swift.String, protocol<>>' 的值转换为 'Swift.AnyObject'

c# - Azure 通信服务 - 如何针对 Azure IAM 进行身份验证

c# - NUnit 抛出 InvalidOperationException : Service Manager failed to initialize RecentFilesService

c# - 如何正确使用 distinct 和 compare?

python - 每个项目存储可变数量的值

python - 为什么变量在循环中调用后会发生变化?