Linq/Enumerable任何Vs包含

ric*_*ris 3 c# linq enumerable

我已经解决了我遇到的一个问题但是虽然我已经发现了某些东西是如何工作的(或者没有)我不明白为什么.

因为我是那种喜欢知道"为什么"的人,我希望有人可以解释:

我有项目列表和相关评论,我想区分管理员评论和用户评论,所以我尝试了以下代码:

User commentUser = userRepository.GetUserById(comment.userId);
Role commentUserRole = context.Roles.Single(x=>x.Name == "admin");
if(commentUser.Roles.Contains(commentUserRole)
 {
   //do stuff
 }
else
{
 // do other stuff
}
Run Code Online (Sandbox Code Playgroud)

单步执行代码显示虽然它具有正确的Role对象,但它无法识别commentUser.Roles中的角色

最终有效的代码是:

if(commentUser.Roles.Any(x=>x.Name == "admin"))
{
  //do stuff
}
Run Code Online (Sandbox Code Playgroud)

我对此感到高兴,因为它的代码较少,而且我认为更干净,但我不明白包含什么不起作用.

希望有人能为我解决这个问题.

It'*_*ie. 9

可能是因为你没有覆盖相等比较(Equals,GetHashCode,operator==在你的)Role类.因此,它正在进行参考比较,这实际上并不是最好的主意,好像它们不是同一个对象,它让它认为它是不同的.您需要覆盖这些相等运算符以提供值相等.

  • 因为他没有在Role对象之间使用`==`,所以如果他重载`operator ==`并不重要,但是你正确地重写了'Equals`和`GetHashCode`. (2认同)
  • @richardterris这完全取决于你的对象上下文如何处理对同一个对象的第二个请求.看起来行为是创建一个新对象而不是返回已经请求的对象.这意味着即使所有属性值都相同,它们实际上是不同的对象,如果没有相等的覆盖,则该值返回false. (2认同)