gpt4 book ai didi

c# - 将对象隐式转换为字符串,用于哈希表

转载 作者:太空狗 更新时间:2023-10-29 21:18:55 24 4
gpt4 key购买 nike

假设我们有这个类:

public class Moo
{
string _value;

public Moo(string value)
{
this._value = value;
}

public static implicit operator string(Moo x)
{
return x._value;
}

public static implicit operator Moo(string x)
{
return new Moo(x);
}

public override bool Equals(object obj)
{
if (obj is string)
return this._value == obj.ToString();
else if (obj is Moo)
return this._value == ((Moo)obj)._value;
return base.Equals(obj);
}

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

如果我将这种类型的对象添加到哈希表中,那么我可以使用相同的字符串找到该对象。
但是如果 Hashtable 包含的是字符串而不是对象,当我传递对象时它会找不到它。

Moo moo = new Moo("abc");
bool result1 = moo == "abc"; //true
bool result1a = moo.Equals("abc"); //true
bool result2 = "abc" == moo; //true
bool result2a = "abc".Equals(moo); //true
bool result2b = ((object)"abc").Equals(moo); //false

Hashtable hash = new Hashtable();
hash[moo] = 100;
object result3 = hash[moo]; //100
object result4 = hash["abc"]; //100

hash = new Hashtable();
hash["abc"] = 100;
object result5 = hash[moo]; //null!!!!
object result6 = hash["abc"]; //100

我已经尝试覆盖 operator== 并且没有任何区别。
是否可以通过这种方式在 Hashtable 中使用隐式转换?

最佳答案

首先,为什么要使用哈希表而不是通用的 Dictionary<,>

无论如何,您的问题是哈希表正在调用 ((object)"abc").Equals(moo) ,当然会返回 false。您可以通过传递自己的 IEqualityComparer 实现来覆盖该行为到 HashTable 之一具有 IEqualityComparer 的构造函数参数。

正如您所指出的,由于您试图避免修改遗留代码,因此您可能无法用具有自定义 IEqualityComparer 的哈希表替换现有的哈希表。如果这是真的,那么我认为答案是你不能做你想做的事。

由于您正在开发这个“moo”类,我想您可以控制将 moo 类传递给哈希表索引器的代码。如果那是真的,你可以调用 ToString()在你传递给索引器的对象上,当然,覆盖 ToStringMoo .

关于c# - 将对象隐式转换为字符串,用于哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com