找不到简单的答案。我的问题是我试图将列表中对象的VALUE与对象的VALUE进行比较......
我的班级:
)
我创建了theMatchList。似乎我只能用' theMatchList.Contains ...'
来比较对象而不是对象的值。public class MatchList
{
public int SomeInt { get; set; }
public decimal SomeDecimal { get; set; }
}
如何解雇' DoSomething'?假设在匹配列表中有一个条目'其中值分别等于12和2.3。我知道它与iequatable有关,但我不太明白它是如何工作的。提前谢谢!
答案 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