比较列表中所有位置的项
本文关键字:位置 列表 比较 | 更新日期: 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();