C# 如何在C中比较自定义泛型列表?
我有两个类A的列表,A实现了EqualObject obj和GetHashCode这两个方法工作正常,代码如下C# 如何在C中比较自定义泛型列表?,c#,list,ienumerable,C#,List,Ienumerable,我有两个类A的列表,A实现了EqualObject obj和GetHashCode这两个方法工作正常,代码如下 class A { public string TEST { get; set; } public override bool Equals(object obj) { return ((A)obj).TEST == this.TEST; } public override i
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();
}
}
这个类有两个列表,第一个列表={X1,X2,X3}和第二个列表={X1,X2,Y1}。当我使用firstList.ExceptsecondList时,它总是返回firstList和secondList中的所有元素。ExceptfirstList还返回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。测试属性用于什么?此代码不编译。Test没有类型。Test是string,我已经修复了它=根据示例类结构,它的行为对我来说是正确的。请发布一个无法正常工作的完整代码示例。若测试是字符串,该怎么办?我可以使用obj.TEST==this.TEST吗?因为字符串是非常特殊的东西。我将示例更改为字符串。如果测试是字符串,我需要使用Equals,==始终返回false,即使它具有相同的值。结果字段是否应为公共字段?否。关键是测试就像结果的包装器,因为Equals可以访问私有成员,所以它不应为公共字段。