设置一个简单的iequatable类c#
本文关键字:iequatable 简单 一个 设置 | 更新日期: 2023-09-27 17:58:49
找不到简单的答案。我的问题是,我试图将列表中对象的值与对象的值进行比较。。。
我的班级:
public class MatchList
{
public int SomeInt { get; set; }
public decimal SomeDecimal { get; set; }
}
我创建了MatchList。我似乎只能比较对象,而不能将对象的值与"MatchList.Contains…"进行比较
MatchList ML = new MatchList();
ML.SomeInt = 12;
ML.SomeDecimal = 2.3;
if (theMatchlist.Contains(ML))
{
DoSomething;
}
如何启动"DoSomething"?假设"匹配列表"中有一个条目,其中的值分别等于12和2.3。我知道这与iequatable有关,但我不太明白这是怎么回事。提前感谢!
您的命名有点不清楚,我假设您实际上有一个List<MatchList>
,您想在其中找到特定的MatchList
(在这种情况下,我建议将MatchList
重命名为至少MatchItem
,最好是更具描述性的名称)。
然后从List<T>.Contains
:的文档
此方法通过使用默认的相等比较器来确定相等,该比较器由对象对T(列表中值的类型)的
IEquatable<T>.Equals
方法的实现定义。
因此,您必须为您的类实现IEquatable<T>
。此外,建议
[i] 如果实现Equals,还应该重写Object.Equals(Object)和GetHashCode的基类实现,以便它们的行为与IEquatable.Equals方法的行为一致。
如果实现GetHashCode
,其结果在对象的生存期内不应发生变化。在大多数情况下,使类不可变就足够了。如果您需要能够更新字段,则需要以不同的方式实现GetHashCode
。
总而言之,如果你想使用Contains
,你的课程最终会看起来像下面这样:
public class MatchList : IEquatable<MatchList>
{
// Note: Fields are readonly to satisfy GetHashCode contract
private readonly int someInt;
private readonly decimal someDecimal;
// Public constructor creates immutable object
public MatchList(int myInt, decimal myDecimal)
{
this.someInt = myInt;
this.myDecimal = myDecimal;
}
// Properties are now read-only too.
public int SomeInt { get { return this.someInt; } }
public decimal SomeDecimal { get { return this.someDecimal; } }
// Implementation of IEquatable<MatchList>
public bool Equals( MatchList other )
{
return (other != null)
&& (this.SomeInt == other.SomeInt)
&& (this.SomeDecimal == other.SomeDecimal);
}
// Override of Object.Equals
// Calls the IEquatable.Equals version if possible.
public override bool Equals( object obj )
{
return (obj is MatchList) && this.Equals(obj as MatchList);
}
public override int GetHashCode()
{
return (this.someInt * 17) ^ this.someDecimal.GetHashCode();
}
}
正如我所评论的,你的问题很不清楚,所以我会尽力解释这个概念。
很可能你试图编码的是列表中的项目而不是列表本身:
public class MatchItem : IEquatable<MatchItem>
{
public int SomeInt { get; set; }
public decimal SomeDecimal {get; set; }
public bool Equals(MatchItem item)
{
if(item == null)
return false;
return this.SomeInt == item.SomeInt && this.SomeDecimal == item.SomeDecimal;
}
// You should also override object.ToString, object.Equals & object.GetHashCode.
// Omitted for brevity here!
}
您会注意到它有一个IEquatable<MatchItem>
的实现,它允许将它与MatchItem
的其他实例进行比较。
此后,此代码将起作用:
var items = new List<MatchItem>()
{
new MatchItem{SomeInt = 1, SomeDecimal = 0.3M},
new MatchItem{SomeInt = 12, SomeDecimal = 2.3M}
};
var searchItem = new MatchItem{SomeInt = 1, SomeDecimal = 0.3M};
Console.WriteLine(items.Contains(searchItem)); // true
工作示例:http://rextester.com/ZWNC6890