在c#中比较可空整型和字符串是否相等

本文关键字:字符串 是否 整型 比较 | 更新日期: 2023-09-27 18:13:33

我经常在c#中找到比较两个值或对象的理由-通常是不同的类型-并且我发现自己对自己编写的代码不满意。
代码最终看起来(对我来说)冗长和不清楚,我经常觉得需要添加一个注释,说"//检查它们是否相等"。
(我经常责怪它没有空安全解引用操作符,就像我在Groovy中看到的那样。)

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

假设我想比较它们,这样我就可以在它们"明显相等"的情况下做一些事情。
我将它们定义为"明显相等",如果:
A) int?不包含数字且字符串为空,否则…
B)如果你写出整型数的数值你会得到什么?以普通/未格式化的方式。

请注意,在这种情况下,我实际上并不关心数字1234是否被认为等于字符串"01234"或"1234.00"(或者实际上是"1234,00",如果你是我认为的外国)。
只要"1234"被认为是相等的,并且(例如)"1233+1"answers"1234z"
你也可以灵活地选择int?如果不包含数字,则被认为等于空字符串。

因此,我想要一些[清晰/简单/简短-为主观道歉]表达来放入我的"if"条件,它将执行上述要求的检查,并且绝对不会抛出异常。
我有什么选择?

(如果有人想比较他们的解决方案如何更容易地在其他语言中表达,请随意。知道哪里的草更绿总是有用的…)

更新:

我自己的代码可以归结为…
if (s == (i.HasValue ? i.Value.ToString() : null))
这看起来还不错,因为s和I在其他对象上没有意义的命名属性。然而,我真的不喜欢在那里留下一个"=="比较,因为(尽管它适用于字符串,因为字符串实习和/或操作符覆盖或其他东西)它通常检查引用相等,对吧?所以我会考虑用string。equals。但那读起来更可怕。

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

我真的希望能够简单地检查正条件,并将其他所有内容计算为false(而不抛出可见的异常)。所以…

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

或者类似的very "happy",如果所有可能的(null-ref/parse)异常都可以被静默地强制为false。
我想我只是年纪大了太懒了....

在c#中比较可空整型和字符串是否相等

    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))...

如果有一个值"i"永远不能是(比如-1),你可以这样写:

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

这对特殊的数字格式不起作用。所以这可能会有帮助:

int x;
!((i == null) != (s == null) || i != null && (!ToInt32.TryParse(s, out x) || i != x))