【问题标题】:Comparing value types cast to object比较转换为对象的值类型
【发布时间】:2012-11-07 15:15:19
【问题描述】:

我有一个返回对象的方法,该对象可以是多种不同数据类型中的一种,包括字符串、数字和布尔值;在某些时候我需要比较从这个方法返回的两个值的相等性。我使用 == 而不是 Equals() 因为我需要不同的数字类型来比较 - 即。 3 == 3.0 - 对于字符串和数字来说效果很好,但由于某种原因,当我比较布尔值时它会下降。

解决此问题的最佳方法是什么?我宁愿不必检测类型并强制转换为 bool,但如果没有其他解决方案我会这样做

我的代码如下所示:

private object GetValue() {
    // does some stuff, returns either a boolean, string or number value
}

var value1 = GetValue();
var value2 = GetValue();
if (value1 == value2) {
    // do something
}

【问题讨论】:

  • == 不适合你。时期。 (object)"a" ==new String(new[]{'a'}) 是假的。
  • (object)1 == (object)1.0 false .net 4.0
  • 您是否尝试过创建 3 个单独的函数(重载),每个函数都返回正确的类型,而不必使用 Object?或者也许创建一些基本的泛型类来接受 T?
  • 这通常是一个微不足道的问题,除了你假设不同的类型有时需要被认为是相同的。如果您可以将所有数字类型转换为单一类型(即将所有整数类型转换为double),那么问题将是微不足道的,只需使用object.Equals
  • @JordanWallwork 您能否提供更多详细信息 GetValue() 函数的作用?看来您可以制定其他解决方案而不返回 Object..

标签: c# casting boolean equality value-type


【解决方案1】:
public bool Compare(object value1, object value2)
{
    if (value1.GetType() == value2.GetType())
    {
        return value1.Equals(value2);
    }
    else
    {
        //your logic for handling different numbers
    }
}

【讨论】:

  • 它仍然感觉有点hacky,但我最终使用了它,并且当类型不匹配时只做一个ToString。我并不完全高兴,但至少我现在所有的测试都通过了:)
【解决方案2】:

如何让你的函数返回字符串,然后将结果解析为 bool 或 int 或任何你想要的然后比较?

编辑:

private string GetValue() {}

string val = getValue();
string val2 = getValue();

bool a1;
bool b1;
int a2;
int b2;
double;
double;

bool r1 = bool.TryParse(val, out a1);
bool r2 = bool.TryParse(val2, out b1);
bool r3 = int.TryParse(val, out a2);
bool r4 = int.TryParse(val2, out b2);
bool r5 = double.TryParse(val, out a3);
bool r6 = double.TryParse(val2, out b3);

if ((a1 == b1 && r1 && r2)) || (a2 == b2 && r3 && r4)) || (a3 == b3 && r5 && r6))
return true;

【讨论】:

  • 你不需要分配变量,因为它们都会在TryParse函数中被覆盖。
  • @Default 你是对的,但我不希望出现 tryParse 对两个值都失败并且结果将为 0 = 0 的情况,这将返回 true ......但我编辑了我的答案也许现在看起来更好..
猜你喜欢
  • 2017-03-22
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2023-03-22
  • 2021-12-31
  • 2023-03-11
相关资源
最近更新 更多