当前位置: 首页 > 编程语言 > C#

比较在字典中用作键的对象分享

时间:2023-04-10 15:13:28 C#

比较在字典中用作键的对象放;}publicintB{得到;放;}publicintC{得到;放;}publicintD{得到;放;}}和主要示例:Dictionarydict=newDictionary();myClassfirst=newmyClass();首先.A=2;首先.B=3;myClasssecond=newmyClass();第二个.A=2;第二个.B=3;第二个.C=5;第二个.D=6;dict.Add(首先,newList());if(dict.ContainsKey(second)){////应该来到这里并更新第一个(并且仅在本例中)键的列表//}else{////如果myFirst对象具有A或B属性的不同值//dict.Add(second,newList());}这是如何运作的?如果您总是只希望字典在A和B上进行比较,您有两种选择。使用实现IEqualityComparer的构造函数并将比较逻辑放在那里,或者让您的类实现IEquateableGetHashCode和Equals,以便默认比较器将为您提供所需的结果。如果您只想在一种情况下比较A和B,则需要使用.Keys标度和Linq扩展方法Contains,它允许您传入IEqualityComparer。但是,这样做会失去使用字典的速度优势,因此请谨慎使用。公共类MyClassSpecialComparer:IEqualityComparer{publicboolEquals(myClassx,myClassy){returnxA==yA&&xB==yB}publicintGetHashCode(myClassx){returnxAGetHashCode()+xBGetHashCode();}}//当你只希望它比较这一次时的特殊情况//注意:这将比正常查找慢得多。varmyClassSpecialComparer=newMyClassSpecialComparer();Dictionary>dict=newDictionary>();//(Snip)if(dict.Keys.Contains(second,myClassSpecialComparer)){////应该来这里更新第一个(并且只在这个例子中)键的列表//}//如果你想要它总是比较Dictionary>dict=newDictionary>(newMyClassSpecialComparer());默认情况下,比较根据哈希码将对象放入桶中。如果两个哈希码相同,则执行详细比较(通过调用Equals)。如果您的类既不提供GetHashCode也不实现相等性,则将使用默认的object.GetHashCode-在这种情况下,您的类的任何特定内容都不会用于值比较语义。只会找到相同的引用。如果您不想这样做,请实施GetHashCode并实施平等。例如:publicclassmyClass{publicintA{get;放;}publicintB{得到;放;}publicintC{得到;放;}publicintD{得到;放;}publicboolEquals(myClassother){if(ReferenceEquals(null,other))returnfalse;如果(ReferenceEquals(this,other))返回true;返回other.A==A&&other.B==B&&other.C==C&&other.D==D;}publicoverrideboolEquals(objectobj){if(ReferenceEquals(null,obj))returnfalse;如果(ReferenceEquals(this,obj))返回真;如果(obj.GetType()!=typeof(myClass))返回false;返回等于((myClass)obj);}publicoverrideintGetHashCode(){unchecked{intresult=A;结果=(结果*397)^B;结果=(结果*397)^C;结果=(结果*397)^D;返回结果;}}}在myClass中覆盖:要实现GetHashCode方法,您只需要从整数属性中XORGetHashCodes即可。(可选)重写ToString方法,实现IEquatable接口以上是C#学习教程:比较Dictionary中作为Key的对象共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: