0

C# で 2 つの値またはオブジェクト (多くの場合異なる型) を比較する理由を見つけることがよくありますが、自分が書いたコードに不満を感じています。
コードは(私には)冗長で不明瞭に見えてしまい、「//それらが等しいかどうかを確認してください」というコメントを追加する必要があると感じることがよくあります。
(Groovy で一度見たような nullsafe-dereference 演算子がないことをよく非難します。)

最近の例では、2 つの変数があります。
string s;
int? i;

「明らかに等しい」場合に何かできるように、それらを比較したいとしましょう。
次のいずれかの場合、私はそれらを「明らかに等しい」と定義しています:
a)int?数値が含まれておらず、文字列が null である、またはそうでない場合...
b) 文字列は、int の数値を書き出すと得られるものですか? プレーン/フォーマットされていない方法で。

[この場合、数値 1234 が文字列 "01234" または "1234.00" (または、私が外国人と見なす場合は実際には "1234,00") と等しいと見なされるかどうかは実際には気にしないことに注意してください)。"1234"が等しいと見なされ、(たとえば) "1233+1" と "1234z"が等しくない
限り、どちらの方法でも柔軟に対応できます。 int かどうかについても柔軟に対応できますか? 数値を含まないものは、空の文字列と等しいと見なされます。]

したがって、上記の必要に応じてチェックを実行し、間違いなく例外をスローしない「if」条件に[明確/単純/短い-主観性をお詫びして]式を入れたいと思います。
私のオプションは何ですか?

(誰かが自分の解決策を他の言語でより簡単に表現できる方法と比較したい場合は、お気軽に。緑の草がどこにあるかを知ることは常に役に立ちます...)

アップデート:

私自身のコードは次のようなものに要約されます... s と i が他のオブジェクトのプロパティに意味のある名前が付けられていないため、実際にはそれほど悪くはありません。[ただし、「==」比較をそこに残すのはあまり好きではありません (文字列のインターンや演算子のオーバーライドなどのために文字列に対しては機能しますが) 通常は参照の等価性をチェックしているためですよね? だから私はそれをstring.Equalsに置き換えることを検討します...しかし、それは読むのがさらに恐ろしいです.]
if (s == (i.HasValue ? i.Value.ToString() : null))

null の親オブジェクト (「意味のあるプロパティ」が存在するオブジェクト) もチェックする必要がある場合、コードは非常に長くなります。それが、質問を投稿したときに頭に浮かんだことだと思います。私が欠けているものを他の人が持っているかどうかを見たかったのです。

私は本当に単純に肯定的な条件をチェックし、他のすべてを false と評価できるようにしたいと考えています (目に見える例外をスローすることなく)。そう...

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

または同様のものは、可能なすべての (null-ref / parse) 例外が暗黙のうちに false に強制される場合、非常に「幸せ」になります。
私は年をとって怠けすぎているだけだと思います....

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 に答える