递归比较两个对象数组

时间:2011-01-12 14:52:53

标签: c# reflection

我正在使用一个外部库,它返回一个对象数组,用于旧状态和对象的当前状态(数组中的每个项代表属性及其值)。到目前为止,我想出了:

for(var i = 0; i< oldState.Length; i ++){     return oldState [i] .Equals(state [i]); }

这会比较所有顶级属性。但我也希望深入研究复杂属性的一些(标有属性CompareComplex的那些),并比较它们的属性之间的差异。我想最好的方法是使用递归函数。我无法理解这一点,但我确信解决方案非常简单。

如果有人可以提供帮助,我真的很感激。感谢

3 个答案:

答案 0 :(得分:2)

您的代码仅比较第一个元素!

更好:

return oldState.SequenceEquals(state);

执行“深度比较”会覆盖“州”类的Equals()方法。

答案 1 :(得分:0)

迭代的方法可能是:

  • 编写代码,了解您如何比较一对对象(oldObjectobject
  • 将该测试复制到循环中,并在运行比较代码之前将对象设置为

像:

for (var i = 0; i < oldState.Length; i++)
{
    ObjectType oldObject = oldState[i];
    ObjectType object= state[i];

    \\insert your comparison code here
    oldObject.Property.Equals(object.Property);
}

重要的是,取出return语句,以便在i == 0的迭代后执行不会停止,并将结果保存在另一个对象中。

答案 2 :(得分:0)

为你的答案欢呼,我设法提出了以下方法:

private bool Compare(Type type, string[] propertyNames, object[] oldState, object[] state) {
    // Get the property indexes to ignore
    var propertyIndexesToIgnore = type.GetProperties()
        .Where(p => p.GetCustomAttributes(typeof(IgnoreLoggingAttribute), false).Count() > 0)
        .Select(p => Array.IndexOf(propertyNames, p.Name)).ToArray();

    // Get the child property indexes
    var childPropertyIndexes = type.GetProperties()
        .Where(p => p.GetCustomAttributes(typeof(ChildLoggingAttribute), false).Count() > 0)
        .Select(p => Array.IndexOf(propertyNames, p.Name)).ToArray();

    for (var i = 0; i < oldState.Length; i++) {
        // If we need to check the child properties
        if (childPropertyIndexes.Contains(i)) {
            if (oldState[i] == null)
                break;

            var childPropertyType = oldState[i].GetType();
            var childProperties = oldState[i].GetType().GetProperties();

            // Recursively call this function to check the child properties
            if (Compare(childPropertyType, childProperties.Select(p => p.Name).ToArray(), childProperties.Select(p => p.GetValue(oldState[i], null)).ToArray<object>(), childProperties.Select(p => p.GetValue(state[i], null)).ToArray<object>()))
                return true;
        } else if (!propertyIndexesToIgnore.Contains(i) && ((oldState[i] != null && state[i] != null && !oldState[i].Equals(state[i])) || (oldState[i] != null && state[i] == null) || (oldState[i] == null && state[i] != null)))
            return true;
    }

    return false;
}

有几点需要注意:

  1. 我的初始对象数组中的属性数量与type.GetProperties()中的项目数不匹配。我无法看到如何判断对象数组中的对象是否具有IgnoreLogging属性,因此我将其与类型进行比较。
  2. ChildLoggingAttribute用于确定属性何时是复杂类型。
  3. 如果有人对如何改进这一点有任何建议,那么我真的很感激。感谢