Сравнение объектов C # с использованием Json - PullRequest
4 голосов
/ 03 января 2011

Я хочу сравнить два объекта без реализации метода Equals ().

Каковы недостатки сравнения их таким образом: 1. сериализация их с Json 2. сравнение результатов

спасибо!

Ответы [ 4 ]

7 голосов
/ 03 января 2011

Каковы недостатки сравнения их таким образом

потеря скорости. Преобразование объектов в строки JSON с последующим их сравнением происходит намного медленнее, чем выполнение свойства по свойству equals.

Реализация Equals() всегда лучший способ сравнить два объекта на равенство.

3 голосов
/ 03 января 2011

Недостатком является то, что вам нужно их сериализовать, что потенциально медленно и определенно медленнее, чем реализация Equals.

Вы также можете получить часть объектов, которые нужно сравнить, не будучиseriazlied и, следовательно, не получить истинное сравнение.

2 голосов
/ 03 января 2011

Есть некоторые издержки в процессе сериализации для преобразования объектов в json.Вам нужно проверить, приемлемы ли издержки для вашей ситуации.

Помимо этого, источник объекта json вызывает беспокойство.Я видел несколько разных сериализаторов json, которые по-разному форматируют объекты (например, цитируют имена свойств и не цитируют их).Такие вещи могут привести к неверным результатам.

1 голос
/ 04 августа 2011

Может быть, с таким классом вы можете выполнить работу (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;
        }
}
...