检查List <myclass>是否包含某些MyClass对象的副本的正确方法是什么?</myclass>

时间:2015-03-17 11:31:31

标签: 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;

    public situation(/*rule rule,*/ string terminal, int pointPosition) {
        //this.rule = rule;
        this.term = terminal;
        this.pos  = pointPosition;
    }
}

在我的程序中,我生成了必须添加到state列表中的新states个对象。但是,只有此列表中的state不相同situation列表中的state个对象的顺序并不重要,并且可能在两个state中有所不同事实上是平等的。)

我试过这个:

states.Add(new state());
states[0].Add(new situation("#", 0));

state s = new state();
s.Add(new situation("#", 0));

if (states.Contains(s)) {
    Console.WriteLine("HODOR"); //not performed
}

看起来Contains无法正常使用自定义对象,因此我必须创建一些自定义方法。

我可以比较每个对象和每个字段,但......它看起来像是一个相当乏味和丑陋的解决方案。可能在这里有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

在你的情境类中覆盖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;
      }
}

答案 1 :(得分:1)

我也补充说:

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;
    }
}

所以我的例子有效。