Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中比较自定义泛型列表?_C#_List_Ienumerable - Fatal编程技术网

C# 如何在C中比较自定义泛型列表?

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

我有两个类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 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可以访问私有成员,所以它不应为公共字段。