Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Net.Core Object.Equals()返回false,即使两个对象相同_C#_Linq_Equals - Fatal编程技术网

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