C# 比较两个对象数组,但不知道它们的类型
我需要你的帮助!我想比较两个对象数组。这些数组应该相同,但顺序不相同 上下文: 我正在编写一个函数来比较同一类型的对象树。通过反射,我检查第一个对象和第二个对象的每个属性,当:C# 比较两个对象数组,但不知道它们的类型,c#,.net,C#,.net,我需要你的帮助!我想比较两个对象数组。这些数组应该相同,但顺序不相同 上下文: 我正在编写一个函数来比较同一类型的对象树。通过反射,我检查第一个对象和第二个对象的每个属性,当: 我找到一个基本类型,我比较它,如果发现差异,我 把它列在一个清单里 我找到一个对象,我(递归地)调用这两个对象上的方法 我找到一个数组,我检查长度是否相同,我解析 数组并将每个值与方法进行比较(递归)在这种情况下,我需要对数组进行排序,以确保对象的顺序相同 我所想但无法实现的方式: 我不能重写类的equals方法,
- 我找到一个基本类型,我比较它,如果发现差异,我 把它列在一个清单里
- 我找到一个对象,我(递归地)调用这两个对象上的方法
- 我找到一个数组,我检查长度是否相同,我解析 数组并将每个值与方法进行比较(递归)在这种情况下,我需要对数组进行排序,以确保对象的顺序相同
- 我不能重写类的equals方法,因为有很多 类,它们由基于XSD文件的工具自动生成
- 我试图在IComparer接口中使用GetHashCode,但是 GetHashCode处理引用,那么排序就没有意义了
谢谢您的帮助。您知道,如果性能出现问题,仅使用反射比较两个对象树会给您带来麻烦吗?您应该始终尽可能避免反射,尤其是在处理大型对象树时。反射对于概念证明来说是可以的,但对于更多的概念来说则不是 但是重写Equals方法有什么错呢?XSD通常不会生成Equals方法,因此您可以自由地使用自己的东西使用分部类扩展这些生成的类。这正是创建分部类的目的,以便更轻松地复制静态和生成代码
编辑:请注意,如果覆盖Equals,还必须相应地覆盖GetHashCode。但是,这意味着默认情况下,使用类的所有对象都将使用值相等。如果这不是您想要的,那么Alex Pashkin建议的自定义
IEqualityComparer
是更好的选择。在这种情况下,您可以实现自己的IEqualityComparer
public class MyComparer<T> : IEqualityComparer<T> where T : class
{
public bool Equals(T x, T y)
{
//your code here
}
public int GetHashCode(T obj)
{
return obj.GetHashCode();
}
}
公共类MyComparer:IEqualityComparer其中T:class
{
公共布尔等于(TX,TY)
{
//你的代码在这里
}
公共int GetHashCode(T obj)
{
返回obj.GetHashCode();
}
}
例如,如果你想在exept中使用它,你只需这样做
var list1 = new List<object>();
var list2 = new List<object>();
var rest = list1.Except(list2, new MyComparer<object>());
var list1=新列表();
var list2=新列表();
var rest=list1.Except(list2,newmycomparer());
我找到了这个解决方案
我实现了一个IComparer,并将我的对象与转换为字符串的流进行比较(虽然不是很优雅,但它工作得很好):
我可以使用序列化,因为我的对象树被标记为序列化(用于XML序列化)
我是这样用的:
Array.Sort(valueReferenceArray, ((IComparer)new ObjectStreamComp()));
Array.Sort(valueCreatedArray, ((IComparer)new ObjectStreamComp()));
所有对象都可以序列化吗?然后序列化并比较结果。是的,这就是我最后使用的,它们是可序列化的(用于XML序列化)。谢谢您的回答。我知道与反射相关的性能问题。我将只在测试环境中使用它,我不需要良好的性能。我不能为XSD的每个元素实现equals函数,它代表了太多的工作!谢谢你的回答。代替IEqualityComparer,我实现了IComparer,这是关于原始主题的更多信息。例如,除了IComparer,您无法实现,因为它需要IEqualityComparer。对于具有两个IEnumerable的大多数linq操作,您需要一个IEqualityComparer,而没有意义的IComparer
Array.Sort(valueReferenceArray, ((IComparer)new ObjectStreamComp()));
Array.Sort(valueCreatedArray, ((IComparer)new ObjectStreamComp()));