C# 自指类上的不等式
使用表单从用户获取输入,将其创建到对象ToDo中。信息被抛出到这个自引用类ToDo中以创建对象,然后被传递到另一个类队列 但问题是,我需要将传递的以下对象与以前的其他对象进行比较。如果对象具有相同的名称,则不要将信息抛出队列类 但是从我的代码来看,Equals方法甚至没有执行。只是想知道我做错了什么C# 自指类上的不等式,c#,forms,self-reference,C#,Forms,Self Reference,使用表单从用户获取输入,将其创建到对象ToDo中。信息被抛出到这个自引用类ToDo中以创建对象,然后被传递到另一个类队列 但问题是,我需要将传递的以下对象与以前的其他对象进行比较。如果对象具有相同的名称,则不要将信息抛出队列类 但是从我的代码来看,Equals方法甚至没有执行。只是想知道我做错了什么 public class ToDo : IEquatable<ToDo> { private string _name; private string _priority
public class ToDo : IEquatable<ToDo>
{
private string _name;
private string _priority;
private ToDo _next;
private ToDo _previous;
Queue queue = new Queue();
public ToDo(string name, string priority)
{
_name = name;
_priority = priority;
_next = null;
_previous = null;
queue.Enqueue(this);
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public string Priority
{
get { return _priority; }
set { _priority = value; }
}
public ToDo Next
{
get { return _next; }
set { _next = value; }
}
public ToDo Previous
{
get { return _previous; }
set { _previous = value; }
}
public bool Equals(ToDo other)
{
if (ReferenceEquals(null, other))
return false;
if (ReferenceEquals(this, other))
return true;
return other.Name.Equals(Name);
}
public override bool Equals(object obj)
{
if (Object.ReferenceEquals(null, obj))
return false;
if (Object.ReferenceEquals(this, obj))
return true;
if (this.GetType() != obj.GetType())
return false;
return this.Equals(obj as ToDo);
}
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
}
这是一个您可以使用的IEqualityComparer类。IEqualityComparer的优点是可以在LINQ语句中使用此比较器,如
var todos1 = todos2.Except(todos3, new ToDoComparer());
public class ToDoComparer : IEqualityComparer<ToDo>
{
public bool Equals(ToDo x, ToDo y)
{
//Check whether the compared objects reference the same data.
if (ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
return false;
return x.Name.Equals(y.Name);
}
public int GetHashCode(ToDo todo)
{
if (ReferenceEquals(todo, null) || todo.Name == null)
return 0;
return todo.Name.GetHashCode();
}
}
您可以尝试创建另一个实现IEqualityComparer的类并使用它。我在过去成功地使用了IEqualityComparer为什么要将对象放入对象内部的队列中?特别是因为队列似乎没有被使用,或者您只是为了简洁而省略了该代码?这将为您创建的每个对象生成一个队列。你确定这是你想要的行为吗?是的,对不起,伙计们。为了更简短的描述,我删去了queue类。有点忽略queue.Enqueue代码行,它将解决queue.Enqueue方法在equals返回true时执行的问题