我有以下列表:
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;是假的......我错过了什么?
有没有办法比较这两个列表,结果是否正确?
答案 0 :(得分:2)
a
和b
包含两个完全不同的对象。 SequenceEquals检查序列中包含的对象的引用。由于它们不同,a.SequenceEquals(b)
返回false。
具体来说,以下内容:
var person = new Person { Id = 1, Address = new Address { PersonId = 1 } };
创建一个Person
对象,并在变量person
中返回对该对象的引用。每次调用new Person { ... }
创建一个新对象时,都会返回一个指向该对象的新引用,尽管在这两种情况下Id
都是相同的。出于同样的原因,Address
和a
中的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;
}
}