linq 如何比较C#中的两个对象列表?

pdkcd3nj  于 2023-07-31  发布在  C#
关注(0)|答案(1)|浏览(137)
public class ClassA
{
    public enum1 Type { get;set;}
    public List<ClassB> lst1 {get;  set;}
}

public class ClassB
{
     public string var1 { get;set;}
     public int var2 { get;set;}
     public List<int> var3 { get;set;}          
     public List<int> var4 { get;set;}          
}

List<ClassA> lst1=Somefunction1();
List<ClassA> lst2=Somefunction2();

字符串
我如何检查lst 1和lst 2是否相等,考虑到顺序,以及我是否想在比较时排除一个属性var1
这是我目前得到的:

var firstNotSecond = lst1.Except(lst2).ToList();
var secondNotFirst = lst2.Except(lst1).ToList();

if ((firstNotSecond.Count > 0) || (secondNotFirst.Count > 0))
{
    // not equal result = false;
}


可以看到,lst 1和lst 2都是ClassA项的列表。列表相等的正常定义是,如果第一个列表中的每个项等于第二个列表中的相应项,则它们相等。对应的意思是具有相同索引的项目。
但是,我不希望对类A的对象进行正常的相等比较,我希望指定特定的相等比较器

  • 如果属性var 2/var 3/ var 4具有相等的值,则ClassB的两个对象被视为相等。
  • 如果属性Type具有相同的值,并且两个ClassA对象的属性lst 1都是Enumerable,则两个ClassA对象相等。

我假设这必须通过为这些类实现IEquality来完成,或者可能为我的lst 1和lst 2创建EqualityComparerer并使用SequenceEqual

ogsagwnx

ogsagwnx1#

public class ClassBEqualityComparer : IEqualityComparer<ClassB>
        {
            public bool Equals(ClassB x, ClassB y)
            {

              if((x.var2.Equals(y.var2)) && (x.var3.SequenceEqual(y.var3)) && (x.var4.SequenceEqual(y.var4)))
              {
                return true;
              }
              else
              {
                return false;
              }       
            }
            public int GetHashCode(ClassB x)
            {

            }
        }


public class ClassAEqualityComparer : IEqualityComparer<ClassA>
{
    public bool Equals(ClassA x, ClassA y)
    {
      ClassBEqualityComparer ClassBEqC = new ClassBEqualityComparer();
      if((x.Type == y.Type) && (x.lst1.SequenceEqual(y.lst1,ClassBEqC)))
      {
        return true;
      }
      else
      {
        return false;
      }        

    }
    public int GetHashCode(ClassA x)
    {

    }
}   


    ClassAEqualityComparer ClassAEqC = new ClassAEqualityComparer();
    bool result = lst1.SequenceEqual(lst2, ClassAEqC);

字符串

相关问题