0

这是单元测试的第一次尝试。我的.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); }
4

3 回答 3

3

List<T>Equals 的实现是object.Equals- Reference Equality 的默认实现。

要查看两个IEnumerable<T>是否相等,您可以使用扩展方法IEnumerable<T>.SequenceEquals- 不要忘记using为命名空间添加语句System.Linq

祝你好运。

于 2013-01-19T19:39:03.477 回答
1

首先,不要在 equal 方法中对集合进行排序。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;
    }
于 2013-01-19T19:44:55.533 回答
0

您可以Sort删除Equals. 我不知道它们的用途是什么,它们不应该在Equals实施中。ListEquals只是引用相等性。您可以在此处使用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));
于 2013-01-19T19:43:20.280 回答