0

MovieDTO オブジェクトのすべてのコレクションと、ユーザーのお気に入りの映画の MovieDTO のコレクションがあります。

特定のアイテムがユーザーのお気に入りに存在する場合、すべてのムービー コレクションの各オブジェクトにブール フラグ Selected =true を追加したいと考えています。

2 つの for-each ループを記述する代わりに、ラムダ式または Func または何らかの方法でそれを実行したいと考えています。

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

ここでループごとに 2 つを使用しない提案はありますか?

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 に答える
-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 に答える