使用Json比较C#对象

时间:2011-01-03 15:34:51

标签: c# json equals

我想在不实现Equals()方法的情况下比较两个对象。

以这种方式比较它们的缺点是什么: 用Json把它们塞进来 2.比较结果

谢谢!

4 个答案:

答案 0 :(得分:7)

  

以这种方式比较它们有什么缺点

速度损失。将对象转换为JSON字符串然后比较它们比通过属性equals执行属性要慢得多。

实现Equals()始终是比较两个对象是否相等的最佳方法。

答案 1 :(得分:3)

缺点是您需要序列化它们,这可能很慢,并且肯定比实施Equals慢。

您最终可能会得到一些您需要比较的对象而不是被严重删除,因此无法进行真正的比较。

答案 2 :(得分:2)

将对象转换为json的序列化过程有一些开销。您必须进行测试,以确定您的情况是否可以接受开销。

除此之外,json对象的来源是一个问题。我已经看到了几个不同的json序列化器格式对象(例如引用属性名称而不是引用它们)。这样的事情会让你产生不真实的结果。

答案 3 :(得分:1)

也许有类似的类你可以做这项工作(BsonDocument是MongoDBDriver的一个类):

    public class Comparer
    {
        private object first, second;

        public Comparer(object first, object second)
        {
            this.first = first;
            this.second = second;
        }

        public List<string> Compare()
        {
            if (first.GetType() != second.GetType())
            {
                return null;
            }

            BsonDocument firstDoc = first.ToBsonDocument();
            BsonDocument secondDoc = second.ToBsonDocument();

            return Compare(firstDoc, secondDoc);
        }

        private List<string> Compare(BsonDocument first, BsonDocument second)
        {
            List<string> changedFields = new List<string>();

            foreach (string elementName in first.Names)
            {
                BsonElement element = first.GetElement(elementName);

                if (element.Value.IsBsonDocument)
                {
                    BsonDocument elementDocument = element.Value.AsBsonDocument;

                    BsonDocument secondElementDocument =
                        second.GetElement(element.Name).Value.AsBsonDocument;

                    if (elementDocument.ElementCount > 1 &&
                        secondElementDocument.ElementCount ==
                        elementDocument.ElementCount)
                    {
                        foreach (string value in (Compare(elementDocument,
                                                       secondElementDocument)))
                        {
                            changedFields.Add(value);
                        }
                    }

                    else
                    {
                        changedFields.Add(element.Name);
                    }
                }

                else if (element.Value != second.GetElement(element.Name).Value)
                    changedFields.Add(element.Name);
            }

            return changedFields;
        }
}