Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查列表是否正确的方法是什么<;MyClass>;是否包含某个MyClass对象的副本?_C#_Oop - Fatal编程技术网

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)
?这就是我需要的。非常感谢。