比较列表中所有位置的项

本文关键字:位置 列表 比较 | 更新日期: 2023-09-27 17:52:16

我有以下类:

public class Person {
   public String Name { get; set; }
   public Int32 Age { get; set; }
}

我有两个person列表:

List<Person> a = service.GetPersons("a");
List<Person> b = service.GetPersons("b");

列表大小相同。是否有可能使用Lambda表达式检查同一职位的人员在两个列表中是否具有相同的Name和Age ?我想检查所有的位置

比较列表中所有位置的项

您可以使用SequenceEqual和自定义比较,如下所示:

var personCmp = new PersonComparer();
var same = a.SequenceEqual(b, personCmp);
...
class PersonComparer : IEqualityComparer<Person> {
    public bool Equals(Person p1, Person p2) {
        return p1.Name==p2.Name && p1.Age == p2.Age;
    }
    public int GetHashCode(Person p) {
        return p.Name.GetHashCode()*31 + p.Age;
    }
}

您可以使用Zip()来解决这个问题:

var equals = a.Zip(b, (xa, xb) => new Tuple<Person, Person>(xa, xb))
              .All(t => 
                       t.Item1.Name == t.Item2.Name &&
                       t.Item1.Age == t.Item2.Age);

注意,只有当两个列表确实具有相同的大小时,这才正确。

此代码未被编译或测试…

你可以这样查找:

// With same index in list...
for(int i=0;i<a.Count;i++)
{
    if(a[i].Name == b[i].Name)
    {
        // do something
    }
}

// check each index in list a against every item in list b
List<Person> duplicates = a.Where(person_A => b.Any(person_B => person_A.Name === person_B.Name)).ToList();

// check by index using lambda...
List<Person> duplicates = a.Where(person_A, index => b[index].Name == person_A.Name).ToList();