C#Net.Core Object.Equals()返回false,即使两个对象相同
我试图返回一个基于客户最喜欢的电影类型的推荐电影列表,但不包括那些已经是他最喜欢的电影类型 这是我的电影对象C#Net.Core Object.Equals()返回false,即使两个对象相同,c#,linq,equals,C#,Linq,Equals,我试图返回一个基于客户最喜欢的电影类型的推荐电影列表,但不包括那些已经是他最喜欢的电影类型 这是我的电影对象 public class Movie { /// <summary> /// Movie's title /// </summary> public string Title { get; set; } /// <summary> /// Movie's gengres list //
public class Movie
{
/// <summary>
/// Movie's title
/// </summary>
public string Title { get; set; }
/// <summary>
/// Movie's gengres list
/// </summary>
public List<string> Genres { get; set; }
private int HashCode
{
get
{
return this.Title.GetHashCode();
}
}
/// <summary>
/// Public default constructor. Initializes an empty Movie object
/// </summary>
public Movie()
{
Genres = new List<string>();
}
/// <summary>
/// Initializes a Movie object with a given title
/// </summary>
/// <param name="title">Movie title</param>
public Movie(string title)
{
Title = title;
Genres = new List<string>();
}
/// <summary>
/// Override ToString function
/// </summary>
/// <returns>Movie's title</returns>
public override string ToString()
{
return Title;
}
public override int GetHashCode()
{
return HashCode;
}
public override bool Equals(object obj)
{
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
Movie movie = (Movie)obj;
return (HashCode == movie.HashCode);
}
}
}
这意味着client2
最喜爱的电影标题Cannery Row(即movie2
)和Delito在Formula Uno(即movie7
)中。最喜欢的类型列表是
"Comedy"
"Drama"
"Romance"
"Crime"
"Thriller"
返回电影推荐的函数是
public static List<Movie> MovieRecommendationsByClient(Client client, List<Movie> moviesCatalog)
{
var recommendations = moviesCatalog
.Where(movie => client.FavoriteMovies
.Any(cm => (!cm.Equals(movie)
&& cm.Genres.Intersect(movie.Genres).Any()))).ToList();
return recommendations;
}
但是断言失败了,因为返回列表还包括“Cannery Row”
和“Delito in Formula Uno”
我也用同样的方法进行了尝试:
var recommendations = from movie in moviesCatalog
from clientMovie in client.FavoriteMovies
where !clientMovie.Equals(movie) && movie.Genres.Intersect(clientMovie.Genres).Any()
group movie by movie into moviesGroup
select moviesGroup.Key;
我还尝试过比较电影标题
属性或GetHashCode()
函数,但没有成功
在调试测试时,我可以看到Equals(movie)
返回我期望的结果,因此我认为我在LINQ查询中做错了什么
非常感谢您提供的任何帮助首先,您可以将您已阅读的电影排除在客户列表中,然后按类型组合进行筛选 它的工作原理是:
var recommendations = moviesCatalog.Except(client.FavoriteMovies)
.Where(movie => client.FavoriteMovies
.Any(cm => cm.Genres.Intersect(movie.Genres).Any())).ToList();
鉴于您呈现代码的方式不连贯,您是否有可能创建一个dotnetfiddle链接,以便我们轻松运行代码?@mjwills这里基本上在您的建议中,您希望在客户端电影和目录之间使用一个设置函数
Intersect\Except
,就像您对流派所做的一样。你认为你说的是从目录中,除了客户已经列出的那些,但实际上你说的是我正在迭代的客户电影与目录中的至少一个移动不匹配,因此客户电影中的任何内容都将被返回,因为目录中至少有一个电影标题不匹配。与您的特定问题无关,但您不应该使用哈希代码来测试相等性。两个不相等的对象完全有可能共享相同的哈希代码。如果你可以通过比较电影名称(你看起来是这样)来测试平等性,为什么不直接使用Title==movie.Title
?@BenM这是我做的第一件事,但现在读到其他评论,我意识到我做LINQ的方式是错误的。无论如何,谢谢大家,真的很感激
public static List<Movie> MovieRecommendationsByClient(Client client, List<Movie> moviesCatalog)
{
var recommendations = moviesCatalog
.Where(movie => client.FavoriteMovies
.Any(cm => (!cm.Equals(movie)
&& cm.Genres.Intersect(movie.Genres).Any()))).ToList();
return recommendations;
}
"Body Melt"
"Ghost Lab"
"The Long and Winding Road"
var recommendations = from movie in moviesCatalog
from clientMovie in client.FavoriteMovies
where !clientMovie.Equals(movie) && movie.Genres.Intersect(clientMovie.Genres).Any()
group movie by movie into moviesGroup
select moviesGroup.Key;
var recommendations = moviesCatalog.Except(client.FavoriteMovies)
.Where(movie => client.FavoriteMovies
.Any(cm => cm.Genres.Intersect(movie.Genres).Any())).ToList();