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()));