通过与不同类型进行比较来检查字典是否包含关键字
本文关键字:检查 字典 是否 关键字 包含 比较 同类型 | 更新日期: 2023-09-27 18:21:53
所以我想做的是这个
var result = dictionary.ContainsKey(Guid.Empty);
其中字典定义为var dictionary = new Dictionary<FooKeyClass, int>();
现在FooKeyClass
基本上只是一些具有Guid
类型公共属性的数据。我试过重写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
}
}
您的两个主要选项如下:
-
使用
Guid
创建一个用作实际密钥的FooKeyClass
实例:var result = dictionary.ContainsKey(new FooKeyClass(Guid.Empty));
-
将词典的类型更改为
Dictionary<Guid, int>
。
如果您经常使用Guid.Empty
作为某个特定目的的密钥,您可以创建等效的密钥FooKeyClass.Empty
,这样您就不必不断创建它的新实例。
请注意,由于FooKeyClass
用作字典的关键字,因此应确保GetHashCode
方法的结果在创建实例后不会更改。在当前的实现中,如果在将键添加到字典后设置FooKeyClass.Guid
属性,则字典中的条目将"丢失",因为哈希代码发生了更改。如果使用Guid
而不是FooKeyClass
作为字典的键,或者可以删除FooKeyClass.Guid
属性的setter并要求用户使用构造函数,则会自动避免这种情况。