比较列表中所有位置的项目

时间:2016-06-27 16:54:49

标签: c#

我有以下课程:

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

我有两个人名单:

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

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

3 个答案:

答案 0 :(得分:6)

您可以使用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;
    }
}

答案 1 :(得分:5)

您可以使用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);

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

答案 2 :(得分:0)

此代码未编译或测试...

你可以寻找这样的骗局:

// 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();