设置一个简单的iequatable类c#

时间:2016-07-26 08:14:29

标签: c# list contains

找不到简单的答案。我的问题是我试图将列表中对象的VALUE与对象的VALUE进行比较......

我的班级:

)

我创建了theMatchList。似乎我只能用' theMatchList.Contains ...'

来比较对象而不是对象的值。
public class MatchList 
    {
        public int SomeInt { get; set; }
        public decimal SomeDecimal { get; set; }
    }

如何解雇' DoSomething'?假设在匹配列表中有一个条目'其中值分别等于12和2.3。我知道它与iequatable有关,但我不太明白它是如何工作的。提前谢谢!

2 个答案:

答案 0 :(得分:1)

您的命名有点不清楚,我认为您实际上有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();
    }
}

答案 1 :(得分:0)

正如我评论的那样,你的问题还不清楚,所以我会尽力解释这个概念。

您尝试编码的很可能是列表中的项目而不是列表本身:

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 的实施方式允许将其与cgroup的其他实例进行比较。

此后,此代码将起作用:

netfilter

工作示例:http://rextester.com/ZWNC6890