2

データ構造の値に基づいて辞書を作成する必要があります。このキーを作成する最適な方法は何でしょうか?

データ構造には、2 つの文字列と日時の 3 つの値があります。これらの 3 つの値を組み合わせて、辞書の「一意の」キーを表します。

public class RouteIdentity
{
     public string RouteId {get;set;}
     public string RegionId {get;set;}
     public DateTime RouteDate {get;set;}
}

頭に浮かぶ1つの解決策は、3つの一意の値の表現を返すプロパティを追加することです(おそらくRouteIdentityと呼ばれますか?)。Keyの型はKey、辞書のキー値の型になります。Keyさまざまなプロパティを単純に連結した文字列値にすることもできますが、これは非常に非効率的です。高速ハッシュ関数を実装して別の型を返す方法があれば、それも機能する可能性があると思います。

もう 1 つの可能性は、 の Equals 演算子をオーバーライドすることですRouteIdentityGetHashCode()これはより良いアプローチかもしれないと考えていますが、そのような目的で関数をオーバーライドする方法がわかりません。

この場合の最適なアプローチが何であるかについて、誰かが光を当てることができますか? 演算子のオーバーロードを使用するのが最善だと思われる場合は、それを適切に実装する方法についていくつかのガイダンスを提供していただけますか?

前もって感謝します。

4

2 に答える 2

3

Equals()とGetHashCode()を実装します。

public class RouteIdentity
{
    public string RouteId { get; set; }
    public string RegionId { get; set; }
    public DateTime RouteDate { get; set; }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        if (obj.GetType() != typeof(RouteIdentity))
        {
            return false;
        }

        RouteIdentity other = (RouteIdentity) obj;

        return Equals(other.RouteId, RouteId) && 
               Equals(other.RegionId, RegionId) && 
               other.RouteDate.Equals(RouteDate);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (RouteId != null ? RouteId.GetHashCode() : 0);
            result = (result * 397) ^ (RegionId != null ? RegionId.GetHashCode() : 0);
            result = (result * 397) ^ RouteDate.GetHashCode();
            return result;
        }
    }
}

...そして、を使用します。new Dictionary<RouteIdentity, TValue>()これは内部でインスタンス化さEqualityComparer<RouteIdentity>.Defaultれ、これら2つのメソッドを使用してインスタンスを比較しRouteIdentityます。

于 2012-07-30T14:12:18.240 に答える
1

を実装IComparableRouteIdentityて使用しますHashSet<RouteIdentity>

于 2012-07-30T14:12:40.343 に答える