1

構造体を作成し、 as キーを保持する2 番目のディクショナリを提供しDictionary<DateTime, Dictionary<APerson, AVisit>>たいIEqualityComparerAPerson

私が内部辞書しか持っていなかった場合、それは

var f = new Dictionary<APerson, AVisit>(new PersonEqualityComparer());

しかし、宣言でそれを提供するコンストラクターが見つかりません。すべての子宣言でそれを渡す必要がありますか、Dictionary<APerson, AVisit>または常に指定された母構造体に指示することは可能IEqualityComparerですか?

4

3 に答える 3

4

Dictionary のすべての子宣言でそれを渡す必要がありますか

はい、外側の辞書の値が辞書であるためです。したがって、この外部ディクショナリに値を挿入するたびに、実際には別の場所でインスタンス化したディクショナリになります。そのため、インスタンス化した場所に等値比較子を提供できます。

于 2012-05-07T13:25:25.533 に答える
3

Dictionary のすべての子宣言でそれを渡す必要がありますか

はい (これが のすべてのインスタンスを意味する場合Dictionary<APerson, AVisit>)。

または、指定された IEqualityComparer を常に持つようにマザー構造体に指示することは可能ですか?

いいえ。

しかし、あなたは再編成することができます。それ以外の

Dictionary<DateTime, Dictionary<APerson, AVisit>>

なぜだめですか

Dictionary<Tuple<DateTime, APerson>, AVisit>

次に、実装するもののインスタンスを1つだけ提供できます

IEqualityComparer<Tuple<DateTime, APerson>>

Tuple<DateTime, APerson>カスタムタイプに置き換えることもできます。

于 2012-05-07T13:24:55.743 に答える
-1

IEqualityComparer<APerson>子ディクショナリの各インスタンスでインスタンスを指定する必要を回避するには、このMSDN ドキュメントIEquatable<APerson>に示されているように実装します。メソッドでは、実際の比較ロジックを記述したり、既に定義したインスタンスを呼び出したりできます。は、オブジェクトが実装していることを検出し、それを比較を行うためのデフォルトとして使用します。APersonEqualsIEqualityComparer<APerson>DictionaryIEquatable<APerson>

このルートに進む場合の推奨事項は、メソッドで毎回新しいインスタンスを作成する必要がないように、Defaultフィールド (静的読み取り専用として宣言) を設定することです。次のようなものが得られるようにします。PersonEqualityComparerEquals

public class PersonEqaulityComparer : IEqualityComparer<APerson>
{
    public static readonly Default = new PersonEqualityComparer();
}

public class APerson : IEquatable<APerson>
{
    public bool Equals(APerson other)
    {
        return PersonEqualityComparer.Default.Equals(this, other);
    }

    public override bool Equals(object other)
    {
        return ((IEquatable<APerson>)this).Equals(other as APerson);
    }

    public override int GetHashCode()
    {
        return PersonEqualityComparer.Default.GetHashCode(this);
    }
}
于 2012-05-07T13:36:24.723 に答える