2

編集: 文化これらの内部操作は、不変の文化 OrdinalIgnoreCaseが最も適切であることを示唆しています。

KeyValuePair は封印されています。var がa = KeyValuePair<string,int>("foo",1)ありvar b = KeyValuePair<string,int>("FOO",2)、比較するa.Key == b.Keyと false になります。

私は真実になりたいです。まず、KeyValuePairs をカスタム クラスにラップしました。

public class MyKeyValuePair
{
    private KeyValuePair<string, int> myKeyValuePair;
    public SyncItem(string Key, int Value)
    {
        myKeyValuePair = new KeyValuePair<string, int>(Key, Value);
    }

    public string Key { get { return myKeyValuePair.Key; } }
    public int Value { get { return myKeyValuePair.Value; } }           
}

私が最初に考えたのは.ToLower()、Key にコンストラクターを追加できるということでした。

これを行うより良い方法はありますか?正しい方法はありますか?どのような要因を考慮する必要がありますか?

4

4 に答える 4

6

小文字に変換する代わりに、演算子の代わりにString.Equals Method (String, StringComparison)を使用できます。(キーは文字列型であるため)==

a.Key.Equals(b.Key, StringComparison.CurrentCultureIgnoreCase)
于 2013-07-24T15:05:50.773 に答える
3

等値演算子をオーバーライドできる==ので、2 つのキーを比較する必要があるたびに呼び出す必要がToLower()なく、他のカスタム メソッドも必要ありません。非常にクリーンで流暢なアプローチ。

public static bool operator ==(KeyValuePair<string, int> myKeyValuePair a, KeyValuePair<string, int> myKeyValuePair b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return a.Key.Equals(b.Key, StringComparison.CurrentCultureIgnoreCase);
}
于 2013-07-24T15:06:28.437 に答える
1

String.Equalsを使用できます:

a.Key.Equals(b.Key, StringComparison.InvariantCultureIgnoreCase)
于 2013-07-24T15:06:01.957 に答える