首页 > 解决方案 > 比较“对象”类型的值的最有效方法是什么

问题描述

我有一个方法需要比较 2 个类型的参数object。这些参数可以是任何类型(例如 string, int, uint, bool... int[],byte[]但要比较的值始终是相同类型的(例如,我们要么将 int 与 int 进行比较,要么将 int[] 与 int[] 进行比较值等)。 在 C# 中执行此操作的最佳和最有效的方法是什么? 这是我尝试过的(但它不适用于数组):

public bool CompareParameterValue(string paramName, object value) 
{
  // Note that value and p.value as assumed to be of same type within this function
  bool wasModified = false;
  var p = Parameters.GetParameter(paramName);

  if ((p.value != null) && !p.value.Equals(value)) 
  {
    p.value = value;
    p.state = "Modified";
    wasModified = true;
  }
  return wasModified;
}

请注意,效率是关键。

标签: c#performanceobjectcompare

解决方案


您可以处理类型的子集,这些类型要么是正确实现的类型,要么是为正确实现 的类型序列实现的类型object.Equals()(例如or或):IEnumerableobject.EqualsList<string>int[]IEnumerable<double>

public static bool ObjectsEqual(object lhs, object rhs)
{
    if (ReferenceEquals(lhs, rhs))
        return true;

    if (lhs == null)
        return false;

    if (rhs == null)
        return false;

    if (lhs.GetType() != rhs.GetType())
        return false;

    if (lhs is IEnumerable seq1 && rhs is IEnumerable seq2)
        return seq1.Cast<object>().SequenceEqual(seq2.Cast<object>());

    return lhs.Equals(rhs);
}

然后你可以在你的CompareParameterValue()方法中调用它而不是调用p.value.Equals(value),即:

if (ObjectsEqual(p.value, value))
    ...

推荐阅读