【问题标题】:POCO comparer not workingPOCO 比较器不工作
【发布时间】:2014-06-13 17:59:44
【问题描述】:

我有一些代码可以让我与实体框架实体进行比较。

但是,我注意到它有时返回 false(不匹配),而实际上它是 true(从逻辑角度来看)。

由于 HashSets 而失败 - 比较时它们总是返回 false。 HashSet 通常是指向我不需要比较的其他实体的导航链接。

我可以对此代码进行任何修改以使其正常工作吗?

namespace Common.Helper
{
    public sealed class PocoHelper<TPOCO> : IEqualityComparer<TPOCO> where TPOCO : class
    {
        public bool Equals(TPOCO poco1, TPOCO poco2)
        {
            var t = typeof(TPOCO);

            if (poco1.IsNotNull() && poco2.IsNotNull())
            {
                bool areSame = true;

                foreach(var property in typeof(TPOCO).GetPublicProperties())
                {
                    object v1 = property.GetValue(poco1, null);
                    object v2 = property.GetValue(poco2, null);

                    if (!object.Equals(v1, v2))
                    {
                        areSame = false;
                        break;
                    }
                };

                return areSame;
            }

            return poco1 == poco2;
        }   

        public int GetHashCode(TPOCO poco)
        {
            int hash = 0;
            foreach(var property in typeof(TPOCO).GetPublicProperties())
            {
                object val = property.GetValue(poco, null);
                hash += (val == null ? 0 : val.GetHashCode());
            };
            return hash;
        }  
    } 
}

【问题讨论】:

  • 你必须使用 IEqualityComparer
  • 所以你必须找到一种方法从比较中排除 HashSet。这应该不会太难。
  • @IamStalker - 你愿意详细说明吗?
  • @GertArnold - 你有什么建议吗?

标签: c# asp.net entity-framework poco iequalitycomparer


【解决方案1】:

当您比较的任何一个或两个对象为空时,您应该返回 false。

        if (poco1.IsNotNull() && poco2.IsNotNull())
        {
            bool areSame = true;

            foreach(var property in typeof(TPOCO).GetPublicProperties())
            {
                object v1 = property.GetValue(poco1, null);
                object v2 = property.GetValue(poco2, null);

                if (!object.Equals(v1, v2))
                {
                    areSame = false;
                    break;
                }
            };

            return areSame;
        } else {
            return false;
        }

因为在 msdn 上给出的“==”将返回 true

    // Returns true.
    Console.WriteLine("null == null is {0}", null == null);

您可以在http://msdn.microsoft.com/en-gb/library/edakx9da.aspx查看

关于哈希集: HashSet 的对象类型不必实现 IEqualityComparer,而只需覆盖 Object.GetHashCode() 和 Object.Equals(Object obj)。你可以在How does HashSet compare elements for equality?看到完整的帖子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多