linq 比较两个复杂类型列表,并获取列表所有属性的true或false结果

fae0ux8s  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(138)

有2个列表

List<Test> t1 = new List<Test>()
{
    new Test("TestName", "MyProperty", 50), 
    new Test("TestName2", "MyProperty2", 50)               
 };
 
List<Test2> t2 = new List<Test2>()
{
    new Test2
    {
        NameT2 = "TestName",
        PropertyT2 = "MyProperty",
        ValueT3 = 50
    },
    new Test2
    {  
        NameT2 = "Hector",
        PropertyT2 = "MyProperties",
        ValueT3 = 60
    }    
};

我们如何比较两个不同复杂类型的列表,以接收true或false作为响应?

我试过

1.这两个列表都将有100列或更多列,因此普通的Linq查询不合适,因为我必须编写并比较所有100个属性或列。
2. *“IdaTransaction.POC.DotNetApps.Model.DataModel.Test2”不包含“名称”的定义 * 是异常。使用交集时

var compareL1 = t1.Intersect(t2,new DynamicComparer());

  public class Test
    {
        public Test(string name, string property, int value)
        {
            Name = name;
            Property = property;
            Value = value;
        }
    
        public string Name { get; set; }
        public string Property { get; set; }
        public int Value { get; set; }
       // public Test(string name, string property, int value)
        //{
        //    Name = name;
        //    Property = property;
        //    Value = value;
        //}
    
      

        //public bool Equals(Test? other) => this.Name == other?.Name;
        //public override int GetHashCode() => (Name).GetHashCode();


    }

    public class Test2
    {
        public string NameT2 { get; set; }
        public string PropertyT2 { get; set; }
        public int ValueT3 { get; set; }
        public int AdditionalT4 { get; set; }

    }
   


    public class DynamicComparer : IEqualityComparer<object>
    {
        public bool Equals(dynamic x, dynamic y)
        {
            return x.Name == y.Name && x.Age == y.Age;
        }

        public int GetHashCode(dynamic obj)
        {
            return ((string)obj.Name).GetHashCode() * 31
                + ((int)obj.Age).GetHashCode();
        }
    }
hc2pp10m

hc2pp10m1#

所以你想知道两个列表是否包含“相同”的项目,并比较所有三个属性?是什么阻止了你这样做:

bool list1ContainsAllOfList2 = t2.All(x2 => t1
    .Any(x1 => x1.Name == x2.NameT2 && x2.Property == PropertyT2 && x1.Value == x2.ValueT3));

如果这不是你所需要的比较,你必须更好地解释你的需求,并展示你已经尝试过的。

相关问题