簡體   English   中英

如何在C#中比較自定義的通用List <>?

[英]How to compare custom generic List<> in C#?

我有2個class A列表, A實現了Equals(object obj)GetHashCode()這2個方法可以正常工作,代碼如下。

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.Except(secondList)所有元素,而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

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

我不知道您的測試類型。 (由於您的屬性未指定類型,因此示例代碼無法正常工作。)如果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));
      }
   }

您可以像這樣使用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);
});

對於上面給出的示例,它可以工作。 我只是喜歡使用匿名方法。

查找lambda表達式和LINQ。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM