设置一个简单的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有关,但我不太明白这是怎么回事。提前感谢!

设置一个简单的iequatable类c#

您的命名有点不清楚,我假设您实际上有一个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