使用C#结构作为字典键的最佳方法是什么?

bil*_*lpg 5 .net c# optimization micro-optimization

我有一个C#结构,我用它作为标准Dictionary集合中的键.我已经为它的GetHashCode和Equals编写了覆盖,但我有点不高兴,Equals被赋予了一个盒装对象,而不是直接引用我的struct类型.

有什么我可以做的来优化我的结构类型使用Dictionary以避免不必要的装箱操作?

(这不是过早的优化,而是完全合适的优化,非常感谢.)

Tim*_*ter 7

您可以实现通用比较器:

public class MyStructComparer : IEqualityComparer<MyStruct>
{
    public bool Equals(MyStruct x, MyStruct y)
    {
        // ...
    }
    public int GetHashCode(MyStruct obj)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其用于字典构造函数:

var myStructDict = new Dictionary<MyStruct, string>(new MyStructComparer());
Run Code Online (Sandbox Code Playgroud)

另一种方法是实现IEquatable<MyStruct>MyStruct,例如:

public struct MyStruct: IEquatable<MyStruct>
{
    public int Id;

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        return obj is MyStruct && Equals((MyStruct)obj);
    }

    public bool Equals(MyStruct other)
    {
        return this.Id == other.Id;
    }

    public override int GetHashCode()
    {
        return this.Id;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以使用默认构造函数初始化字典:

var myStructDict = new Dictionary<MyStruct, string>();
Run Code Online (Sandbox Code Playgroud)

  • @billpg:你也可以实现`IEquatable&lt;MyStruct&gt;`。我已经相应地编辑了我的答案。 (2认同)