C# 检查列表是否正确的方法是什么<;MyClass>;是否包含某个MyClass对象的副本?
我的结构相当复杂:C# 检查列表是否正确的方法是什么<;MyClass>;是否包含某个MyClass对象的副本?,c#,oop,C#,Oop,我的结构相当复杂: public static List<state> states = new List<state>(); public class state : List<situation> { } public class situation { //public rule rule; //another complex object public int pos; public string term; publ
public static List<state> states = new List<state>();
public class state : List<situation> { }
public class situation {
//public rule rule; //another complex object
public int pos;
public string term;
public situation(/*rule rule,*/ string terminal, int pointPosition) {
//this.rule = rule;
this.term = terminal;
this.pos = pointPosition;
}
}
看起来Contains
不能正确处理自定义对象,所以我必须创建一些自定义方法
我可以比较每个对象和每个字段,但是。。。这看起来是一个非常乏味和丑陋的解决方案。这里有更好的方法吗?在您的情境类中重写
Equals
,并实现您自己的等式,即:
public class situation
{
public string Terminal
{
get{ return term;}
}
public int Pos
{
get{ return pos;}
}
public override bool Equals(object obj)
{
bool result;
situation s = obj as situation;
if (s != null)
{
result = Terminal.Equals(s.Terminal) && Pos == s.Pos;
}
return result;
}
}
在情境类中覆盖
等于
,并实现自己的平等,即:
public class situation
{
public string Terminal
{
get{ return term;}
}
public int Pos
{
get{ return pos;}
}
public override bool Equals(object obj)
{
bool result;
situation s = obj as situation;
if (s != null)
{
result = Terminal.Equals(s.Terminal) && Pos == s.Pos;
}
return result;
}
}
我还添加了以下内容:
public class state : List<situation> {
public override bool Equals(object obj) {
state s = obj as state;
if (s != null) {
foreach (situation situation in s) {
if (!this.Contains(situation)) { return false; }
}
foreach (situation situation in this) {
if (!s.Contains(situation)) { return false; }
}
return true;
}
return false;
}
}
公共类状态:列表{
公共覆盖布尔等于(对象对象对象){
状态s=作为状态的obj;
如果(s!=null){
foreach(s中的情况){
如果(!this.Contains(情境)){return false;}
}
foreach(本案例中的情况){
如果(!s.Contains(situation)){return false;}
}
返回true;
}
返回false;
}
}
因此,我的示例很有效。我还添加了以下内容:
public class state : List<situation> {
public override bool Equals(object obj) {
state s = obj as state;
if (s != null) {
foreach (situation situation in s) {
if (!this.Contains(situation)) { return false; }
}
foreach (situation situation in this) {
if (!s.Contains(situation)) { return false; }
}
return true;
}
return false;
}
}
公共类状态:列表{
公共覆盖布尔等于(对象对象对象){
状态s=作为状态的obj;
如果(s!=null){
foreach(s中的情况){
如果(!this.Contains(情境)){return false;}
}
foreach(本案例中的情况){
如果(!s.Contains(situation)){return false;}
}
返回true;
}
返回false;
}
}
所以我的例子是有效的。那么,
包含
将使用等于
来检查是否相等。我要做的第一件事是修正你的名字,使之遵循正常的命名约定,最好是对State
使用组合而不是继承,然后使你的字段私有化。然后阅读如何实现IEquatable
,并在状态和情况下实现它。正如Jon所说,实现Equals方法对您很有用。Contains将返回false,因为默认情况下,它比较两个对象的值不相同。那么,Contains
将使用Equals
检查相等性。我要做的第一件事是修正你的名字,使之遵循正常的命名约定,最好是对State
使用组合而不是继承,然后使你的字段私有化。然后阅读如何实现IEquatable
,并在状态和情况下实现它。正如Jon所说,实现Equals方法对您很有用。Contains将返回false,因为默认情况下,它比较的两个对象的值不同。如果(情况!=null)
,那么是什么?你的意思是如果(s!=null)
?这就是我需要的。非常感谢。如果(情况!=null)
,什么是?你的意思是如果(s!=null)
?这就是我需要的。非常感谢。