2012-09-23 42 views
2

我一直在執行設定平等(即列表比較,其中的順序是無關緊要的)和閱讀,這樣的問題,如thisthis試驗後,寫了下面的簡單擴展:SequenceEqual是真實的,但HashSet.SetEquals是假

public static bool SetEqual<T>(this IEnumerable<T> enumerable, IEnumerable<T> other) 
    { 
     if (enumerable == null && other == null) 
      return true; 

     if (enumerable == null || other == null) 
      return false; 

     var setA = new HashSet<T>(enumerable); 
     return setA.SetEquals(other); 
    } 

但是,我遇到了一種簡單的數據結構,但這種方法不起作用,而Enumerable.SequenceEqual卻可以。

public class Test : IEquatable<Test> 
    { 
     public Guid Id { get; set; } 
     public List<Test> RelatedTest { get; set; } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != typeof(Test)) return false; 

      return Equals((Test)obj); 
     } 

     public bool Equals(Test other) 
     { 
      if (ReferenceEquals(null, other)) return false; 
      if (ReferenceEquals(this, other)) return true; 

      return other.Id.Equals(Id) && 
        RelatedTest.SetEqual(other.RelatedTest); 
     } 
    } 

鑑於這一目的,該測試成功:

[Test] 
    public void SequenceEqualTest() 
    { 
     var test1 = new List<Test> {new Test()}; 
     var test2 = new List<Test> {new Test() }; 

     Assert.That(test1.SequenceEqual(test2), Is.True); 
    } 

但此測試失敗:

[Test] 
    public void SetEqualTest() 
    { 
     var test1 = new List<Test> {new Test()}; 
     var test2 = new List<Test> {new Test()}; 

     Assert.That(test1.SetEqual(test2), Is.True); 
    } 

沒有人有一個解釋?

回答

相關問題