[英]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.