0

我经常找到在 C# 中比较两个值或对象的理由——通常是不同的类型——而且我发现自己对我编写的代码不满意。
代码最终看起来(对我来说)冗长且不清楚,我经常最终觉得需要添加一条注释,上面写着“//检查它们是否相等”。
(我经常责怪没有像我在 Groovy 中看到的那样的 nullsafe-dereference 运算符。)

在最近的一个例子中,我有两个变量:
string s;
int? i;

假设我想比较它们,以便如果它们“明显相等”,我可以做一些事情。
如果有以下任一情况,我将它们定义为“显然相等”:
a)int?不包含数字且字符串为空,否则...
b) 如果您写出 int 的数值,您会得到什么字符串?以普通/未格式化的方式。

[请注意,在这种情况下,我实际上并不关心数字 1234 是否被认为等于字符串“01234”或“1234.00”(或者实际上是“1234,00”,如果你是我认为是外国的)。
只要 "1234"认为是相等的,并且(例如) "1233+1" 和 "1234z"相等,您就可以灵活地处理这些问题。
您还可以灵活地判断是否为 int?不包含数字的被视为等于空字符串。]

所以,我想要一些[清晰/简单/简短-为主观性道歉]表达式放入我的“如果”条件,它将按照上面的要求执行检查并且绝对不会抛出异常。
我有哪些选择?

(如果有人想将他们的解决方案与其他语言更容易表达的方式进行比较,请随意。知道更绿的草在哪里总是有用的......)

更新:

我自己的代码归结为类似...... 现在看起来并没有那么糟糕,因为 s 和 i 在其他对象上没有有意义的命名属性。[但是,我真的不喜欢在其中留下“==”比较,因为(尽管由于字符串内部和/或运算符覆盖或其他原因,它适用于字符串)它通常会检查引用相等性,对吗?所以我会考虑用 string.Equals 替换它......但这读起来更可怕。]
if (s == (i.HasValue ? i.Value.ToString() : null))

当您还必须检查父对象(存在“有意义的属性”)是否为空时,代码就会变得冗长 - 我认为这就是我发布问题时的想法。我想看看其他人是否有我缺少的东西。

我真的希望能够简单地检查积极的情况,并让其他一切都评估为假(不抛出可见的异常)。所以...

if ( (someObject.s == null && someOther.i == null)
||
(int.Parse(someObject.s) == someOther.i) )

如果所有可能的(null-ref / parse)异常都可以被静默强制为假, 或类似的将非常“高兴”。
我想我只是在我晚年变得太懒惰了......

4

2 回答 2

3
    public static bool ObviouslyEquals<T>(this string  s, T? t) where T: struct
    {
        if (s == null && !t.HasValue)
            return true;
        if (s == null || !t.HasValue)
            return false;
        return s.Equals(t.Value.ToString());
    }


string s;
int? i; 
if (s.ObviouslyEquals(i))...
于 2013-05-14T12:29:28.457 回答
0

如果有一个值“i”永远不会是(比如说-1),你可以使用这样的东西:

((object)i ?? -1).ToString() == s

但是,这不适用于特殊数字格式。所以也许这会有所帮助:

int x;

!((i == null) != (s == null) || i != null && (!ToInt32.TryParse(s, out x) || i != x))
于 2013-05-14T12:25:34.463 回答