我拥有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();
有没有建议在这里使用两个循环?
答案 0 :(得分: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();
答案 1 :(得分:0)
假设我们只能按name
比较用户收藏和电影:
var allMovieDTO = AllMovies.Select(x => new MovieDTO
{
Name = x.Name,
Selected = UserFavouriteMovies.Any(f => f.name == x.name)
}).ToList();
答案 2 :(得分:0)
你特别要求使用Func,尽管我确信有更好的方法可以解决这个问题。这是一些代码...
如果列表很大,这可能需要一些时间,因为它会针对每个AllMovies在UserFavoriteMovie上运行搜索。
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)
答案 3 :(得分:-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();
您可以进行一些更改以使其适合您的项目。