0

我有所有 MovieDTO 对象的集合以及用户最喜欢的电影的 MovieDTO 集合。

我想在所有电影集合的每个对象中添加一个布尔标志 Selected =true,如果用户收藏中存在特定项目。

我希望用一些 lambda 表达式或一些 Func 或某种方式来完成它,而不是编写两个 for-each 循环。

public class Movie{
 public string Name{get;set;}
 public DateTime ReleaseDate{get;set;}
 public string Director {get;set;}
 public int Id{get;set;}
 //more property
}

//This class is mainly used to highlight the favourite movie in UI
public class MovieDTO{
 public string MovieName{get;set;}
 public boolean Selected{get;set;}
 public int Id{get;set;}
}

List<Movie> AllMovies = MyService.AllMovies();

List<MovieDTO> UserFavouriteMovie = MyService.GetUserMovies();

List<MovieDTO> allMovieDTO = AllMovies.Select(x => new MovieDTO
{
    Name=x.Name,
    //Selected=true/false => here i want 
     // to check if x is exist in UserFavouriteMovie collection
}).ToList();

有什么建议不在这里为每个循环使用两个吗?

4

4 回答 4

2

获取所有名称并将它们放入一个HashSet有效搜索中,然后仅Contains用于每个项目。

var names = new HashSet<string>(UserFavouriteMovie.Select(movie => movie.Name);

List<MovieDTO> allMovieDTO = AllMovies.Select(x => new MovieDTO
{
    Name=x.Name,
    Selected = names.Contains(x.Name),
}).ToList();
于 2013-01-23T05:27:34.070 回答
0

假设我们只能通过以下方式比较用户的最爱和电影name

var allMovieDTO = AllMovies.Select(x => new MovieDTO
{
   Name = x.Name,
   Selected = UserFavouriteMovies.Any(f => f.name == x.name)
 }).ToList();
于 2013-01-23T05:22:14.380 回答
0

你特别要求使用 Func 所以虽然我确信有更好的方法来解决这个问题。这是一些代码...

如果列表很大,这可能需要一些时间,因为它将在 UserFavoriteMovie 上搜索每个 AllMovies。

        List<Movie> AllMovies = new List<Movie>();

        List<MovieDTO> UserFavouriteMovie = new List<MovieDTO>();

        List<MovieDTO> allMovieDTO = AllMovies.Select(x => new MovieDTO
        {
             MovieName = x.Name
             , Selected = new Func<bool>(() => {

                 if (UserFavouriteMovie.Exists(a => a.Id == x.Id))
                 {
                     return true;
                 }
                 else
                 {
                     return false;
                 }


             }).Invoke()
        }).ToList();

但是,您不需要使用 Func。就这样做...

  , Selected = UserFavouriteMovie.Exists(a => a.Id == x.Id)
于 2017-12-22T15:51:44.183 回答
-1

未列出 Movie 和 MovieDTO 的详细信息。所以我只是写了一个粗略的演示来满足您的要求。

List<int> a = new List<int> { 1, 2, 3, 4 };
List<int> b = new List<int> { 3, 2 };
List<int> c = a.Where(o => b.Contains(o) ).ToList();

您可以进行一些更改以使其适合您的项目。

于 2013-01-23T05:44:00.207 回答