为每个循环过滤一个集合

时间:2013-01-23 05:17:05

标签: c# collections lambda

我拥有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 个答案:

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

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