2010-07-24 83 views
1

我有2個列表class A,A已實施Equals(object obj)GetHashCode()這2個方法工作正常,代碼如下。如何在C#中比較自定義泛型List <>?

class A 
{ 
    public string TEST 
    { 
     get; 
     set; 
    } 

    public override bool Equals(object obj) 
    { 
     return ((A)obj).TEST == this.TEST; 
    } 

    public override int GetHashCode() 
    { 
     return this.TEST.GetHashCode(); 
    } 
} 

我有這個類的2列表,firstList = { X1, X2, X3 }secondList = { X1, X2, Y1 }。當我使用firstList.Except(secondList)時,它總是返回firstList中的所有元素,並且secondList.Except(firstList)也返回secondList中的每個元素,如下所示。

var test1 = firstList.Except(secondList).ToList(); // test1 = all elements of firstList 
var test2 = secondList.Except(firstList).ToList(); // test2 = all elements of secondList 

我想知道我該如何解決這個問題?

+0

什麼是TEST屬性? – 2010-07-24 14:57:44

+0

此代碼不能編譯。測試沒有類型。 – onof 2010-07-24 14:58:00

+0

TEST是字符串,我已經修正了它=) – Anonymous 2010-07-24 15:00:55

回答

0

我不知道你的測試類型。 (示例代碼不起作用,因爲您的屬性沒有指定類型。)如果TEST是引用類型(類),您必須將它們與Equals而不是「=」進行比較。

這工作:

[TestClass] 
    public class UnitTest1 { 
     class MyString { 
     public MyString(string value) { 
      _value = value; 
     } 
     string _value; 
     public override int GetHashCode() { 
      return _value.GetHashCode(); 
     } 
     public override bool Equals(object obj) { 
      MyString other = obj as MyString; 
      if (other != null) 
       return other._value == this._value; 
      return false; 
     } 
     } 

     [TestMethod] 
     public void TestMethod1() { 
     List<MyString> list1 = new List<MyString> { 
      new MyString("1"), 
      new MyString("2"), 
     }; 

     List<MyString> list2 = new List<MyString> { 
      new MyString("2"), 
      new MyString("3"), 
     }; 

     MyString removed = list1[1]; 
     var result = list1.Except(list2); 
     Assert.AreEqual(1, result.Count()); 
     Assert.IsFalse(result.Contains(removed)); 
     } 
    } 
+0

如果TEST是字符串呢?我可以使用obj.TEST == this.TEST嗎? – Anonymous 2010-07-24 15:03:51

+0

比起它會起作用,因爲字符串是「非常特殊」的東西。我將我的示例更改爲字符串。 – 2010-07-24 15:17:22

+0

如果TEST是字符串,我需要使用Equals,==總是返回false,即使它保持相同的值。 – Anonymous 2010-07-24 16:15:28

0

可以使用IEquatable<>接口這樣

public class Test : IEquatable<Test> 
{ 
    public string result; 
    public Test(string result) { this.result = result; } 
    public bool Equals(Test other) 
    { 
     return result.Equals(other.result); 
    } 
    //No need to override Equals(object obj), GetHashCode() 
} 

那麼當您檢查執行以下操作

List<Test> FirstTests = ... 
List<Test> SecondTests = ... 

List<Test> Result = FirstTests.FindAll(delegate(Test item) 
{ 
    return SecondTests.Contains(item); 
}); 

對於給定的上面的例子中它的工作原理。我只是喜歡使用匿名方法。

+0

結果字段應該公開嗎? – 2010-07-24 16:36:41

+0

不。問題的關鍵在於Test像一個結果的包裝器,由於Equals()可以訪問私有成員,所以它不應該公開。 – ja72 2010-07-25 04:13:09

0

查找lambda表達式和LINQ。