这是单元测试的第一次尝试。我的.Equals
方法在TestSet_Equals_True
,TestSet_Equals_True_Shuffled_Order
失败。希望澄清这是否是我单位测试的问题或我的.Equals
方法有问题。
单元测试:
private void Populate(Set set, int count)
{
for (int i = 0; i < count; ++i)
set.Add(i);
}
[TestMethod]
public void TestSet_Equals_True()
{
Set set1 = new Set();
Set set2 = new Set();
Populate(set1, POPULATE_COUNT);
Populate(set2, POPULATE_COUNT);
bool expected = true;
bool actual = set1.Equals(set2);
Assert.AreEqual(expected, actual);
}
类别:
List<object> _set;
//Override Equals
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType())
return false;
Set o = (Set)obj;
if (this._set.Count != o._set.Count)
return false;
o._set.Sort();
this._set.Sort();
return _set.Equals(o._set); }
答案 0 :(得分:3)
List<T>
Equals的实现是object.Equals
的默认实现 - 参考平等。
要查看两个IEnumerable<T>
是否相等,可以使用扩展方法IEnumerable<T>.SequenceEquals
- 不要忘记为using
命名空间添加System.Linq
语句。
答案 1 :(得分:1)
首先,不要在同等方法中对您的集合进行排序。 Equals
不应以任何方式更改您的对象。它应该只确定2个对象是否相同。
您可以使用SequenceEquals
但确实意识到SequenceEquals
无法处理NullReferenceExceptions
。
所以我认为问题在于你的Equals实现。也许你可以尝试这样的事情:
public override bool Equals(object obj)
{
var isEqual = false;
var otherSet = obj as Set;
if (otherSet != null)
{
isEqual = _set.Count == otherSet.Count;
isEqual &= _set.SequenceEqual(otherSet);
}
return isEqual;
}
答案 2 :(得分:0)
您可以删除Sort
中的Equals
来电。我不知道他们服务的目的是什么,他们不应该在Equals
实施中。列表Equals
只是引用相等。您可以使用SequenceEquals
扩展方法IEnumerable<T>
来检查此处的相等性:
var a = new List<int> {1, 2};
var b = new List<int> {1, 2};
Assert.False(a.Equals(b));
Assert.True(a.SequenceEqual(b));