0

所以我想做的是这个

var result = dictionary.ContainsKey(Guid.Empty);

字典定义为var dictionary = new Dictionary<FooKeyClass, int>();

现在FooKeyClass基本上只是一些具有类型公共属性的数据Guid。我尝试过重写 Equals,尝试过编写自己的 Equals,尝试IComparer过继承IEquatable<Guid>。无论我做什么,我似乎都无法获得所需的功能。有人可以告诉我这在 C# 中是否可行,如果可以,我该如何实现它?

这是其余的代码,它有点像现在这样被覆盖:

public class FooKeyClass : IEquatable<Guid>
{
    public Guid Guid { get; set; }
    public string Name { get; set; }

    public bool Equals(Guid guid)
    {
        if (guid == null)
            return false;
        return Guid.Equals(guid);
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        var p = obj as FooKeyClass;
        if ((object)p == null)
            return false;

        return p.Guid.Equals(this.Guid);
    }

    public static bool operator ==(FooKeyClass a, Guid b)
    {
        if (object.ReferenceEquals(a, b))
            return true;

        if (((object)a == null) || ((object)b == null))
            return false;

        return a.Guid.Equals(b);                
    }

    public static bool operator ==(FooKeyClass a, FooKeyClass b)
    {            
        if (System.Object.ReferenceEquals(a, b))
            return true;

        if (((object)a == null) || ((object)b == null))
            return false;

        return a.Guid.Equals(b.Guid);
    }

    public static bool operator !=(FooKeyClass a, FooKeyClass b)
    {
        return !(a == b);
    }

    public static bool operator !=(FooKeyClass a, Guid b)
    {
        return !(a == b);
    }

    public override int GetHashCode()
    {
        return Guid.GetHashCode();
    }
}

/// <summary>    
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var dictionary = new Dictionary<FooKeyClass, int>();

        var savedGuid = Guid.NewGuid();
        var tmpKey = new FooKeyClass() { Guid = savedGuid, Name = "feeefeee" };
        dictionary.Add(tmpKey, 42);

        var result = tmpKey.Equals(savedGuid); // no error
        result = tmpKey == savedGuid; // no error 

        result = dictionary.ContainsKey(savedGuid); // compile errror
        result = dictionary.Contains(savedGuid); // compile errror
        result = dictionary.Contains<Guid>(savedGuid); // compile errror

    }
}
4

1 回答 1

1

您的两个主要选择如下:

  1. 使用Guid创建FooKeyClass您用作实际键的实例:

    var result = dictionary.ContainsKey(new FooKeyClass(Guid.Empty));
    
  2. 将字典的类型更改为Dictionary<Guid, int>.

如果您经常将Guid.Empty其用作某些特定目的的密钥,则可以创建等效密钥FooKeyClass.Empty,这样您就不必继续创建它的新实例。

请注意,由于您FooKeyClass被用作字典的键,因此您应该确保GetHashCode方法的结果在创建实例后不会更改。在您当前的实现中,如果您FooKeyClass.Guid在将键添加到字典后设置属性,则字典中的条目将“丢失”,因为哈希码发生了变化。如果您使用Guid而不是FooKeyClass作为字典的键,则会自动避免这种情况,或者您可以删除FooKeyClass.Guid属性的设置器并要求用户使用构造函数。

于 2014-09-15T15:56:33.593 回答