我的结构非常复杂:
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
无法正常使用自定义对象,因此我必须创建一些自定义方法。
我可以比较每个对象和每个字段,但......它看起来像是一个相当乏味和丑陋的解决方案。可能在这里有更好的方法吗?
答案 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;
}
}
所以我的例子有效。