我想在不实现Equals()方法的情况下比较两个对象。
以这种方式比较它们的缺点是什么: 用Json把它们塞进来 2.比较结果
谢谢!
答案 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;
}
}