1

我想创建一个Dictionary<DateTime, Dictionary<APerson, AVisit>>结构,我想IEqualityComparer第二个字典上提供一个APerson作为键的

如果我只有内部字典,那就是

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>

然后你可以提供一个实现的东西的实例

IEqualityComparer<Tuple<DateTime, APerson>>

您甚至可以Tuple<DateTime, APerson>用自定义类型替换。

于 2012-05-07T13:24:55.743 回答
-1

为了避免必须IEqualityComparer<APerson>在子字典的每个实例上指定实例,您可以执行此MSDN 文档IEquatable<APerson>中所示的实现。在该方法中,您可以编写实际的比较逻辑或调用您已经定义的实例。将检测对象实现并将其用作进行比较的默认值。APersonEqualsIEqualityComparer<APerson>DictionaryIEquatable<APerson>

如果你走这条路,建议在你的身上有一个Default字段(声明为静态只读),PersonEqualityComparer这样Equals你就不必每次都创建一个新实例。这样您就有了类似于以下内容的内容:

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 回答