使用SequenceEquals时,类似的列表是不同的

时间:2016-07-19 20:43:29

标签: c#

我有以下列表:

List<Person> a = new List<Person> {
  new Person {
    Id = 1,
    Address = new Address { PersonId = 1 }
  }
};

List<Person> b = new List<Person> {
  new Person {
    Id = 1,
    Address = new Address { PersonId = 1 }
  }
};

var r = a.SequenceEqual(b);

即使列表相同,也可以使用#34; r&#34;是假的......我错过了什么?

有没有办法比较这两个列表,结果是否正确?

3 个答案:

答案 0 :(得分:2)

ab包含两个完全不同的对象。 SequenceEquals检查序列中包含的对象的引用。由于它们不同,a.SequenceEquals(b)返回false。

具体来说,以下内容:

var person = new Person { Id = 1, Address = new Address { PersonId = 1 } };

创建一个Person对象,并在变量person中返回对该对象的引用。每次调用new Person { ... }创建一个新对象时,都会返回一个指向该对象的新引用,尽管在这两种情况下Id都是相同的。出于同样的原因,Addressa中的b是两个完全不同的引用,尽管PersonId为1。

另一方面,如果我们有以下陈述:

var person = new Person { Id = 1, Address = new Address { PersonId = 1 } };
var a = new List<Person> { person };
var b = new List<Person> { person };

a.SequenceEquals(b)会返回true。

答案 1 :(得分:1)

两个列表都包含两个不同的人员实例。那些人物对象似乎具有相同的值,但它们并不相等。

a.SequenceEqual(b)仅适用于所有索引a[i] == b[i]的{​​{1}}。所以它仍在对这里的人进行比较。

您需要覆盖i类型的Equals(和GetHashCode)方法(也可能覆盖Person),以便实现此目的。

答案 2 :(得分:0)

首先,这两个列表是不同的,因为您使用的proson对象是不同的。你新手两次,这意味着为第一个分配的内存与第二个分配的内存不同。但是,由于您的问题是将列表与相同的项目进行比较,您只需要实现IEquatable,如此处所述 msdn

所以你的代码将是这样的:

<c:set var="name" value="Ololo"/>

class Person:IEquatable<Person>
{
 public int Id{get;set;}
 public bool Equals(Person other)
 {

return Id== other.Id;
}
}