c# - 比较“对象”类型的值的最有效方法是什么
问题描述
我有一个方法需要比较 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;
}
请注意,效率是关键。
解决方案
您可以处理类型的子集,这些类型要么是正确实现的类型,要么是为正确实现 的类型序列实现的类型object.Equals()
(例如or或):IEnumerable
object.Equals
List<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))
...
推荐阅读
- dns - IP地址和域名的区别
- r - 为什么在本地开源 RStudio 上运行的简单闪亮应用程序的加载时间变化很大?
- apache-spark - 如何从 Spark Structured Streaming 刷新 Hive/Impala 表?
- c++ - 在 C++ 中的另一个函数中定义一个函数
- sql - SELECT * 比 SELECT columnlist 快
- xml - 如何将 POST azure api 管理系统中的输入参数转换为 XML 并使其成为请求正文?
- indexing - 如何在维护现有索引的同时执行多个左连接?
- mysql - 调用 APIMAN 的 API 时出错
- python - 如何对列表中的嵌套字典进行排序?
- javascript - 使用 JavaScript 解密 ApplePay 令牌