লিনক যেখানে তালিকার তালিকায় যে কোনও রয়েছে contains


117

লিনাক ব্যবহার করে, আমি কীভাবে আইটেমের একটি তালিকা পুনরুদ্ধার করতে পারি যেখানে তার বৈশিষ্ট্যের তালিকা অন্য তালিকার সাথে মেলে?

এই সহজ উদাহরণ এবং সিউডো কোড নিন:

List<Genres> listofGenres = new List<Genre>() { "action", "comedy" });   
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres);

উত্তর:


202

আপনি চান মত শব্দ:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());

আমি অনুসন্ধান বাক্সের জন্য এই ক্যোয়ারীটি ব্যবহার করার চেষ্টা করছিলাম, এটি ব্যক্তি_নাম কলামে যে কোনও অক্ষর সন্ধান করে, আমি এই ত্রুটিটি পেয়েছি: 'DbIntersectExpression এর সাথে সামঞ্জস্যপূর্ণ সংগ্রহের ফলাফল যুক্তি প্রয়োজন' ফলস্বরূপ টাইপস 'সুতরাং আমি এখান.StartWith, .EndsWith, .Contains থেকে চেষ্টা করেছি এটি কাজ করে, তবে আপনার জিজ্ঞাসাটি ব্যবহার করার জন্য কী করা যেতে পারে?
শাইজুত

@ স্টম: আমাদের এটির জন্য আপনাকে সহায়তা করার মতো পর্যাপ্ত তথ্য নেই - আপনার আরও অনেক প্রসঙ্গে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত ।
জন স্কিটি

@ জোনস্কিট আমি এই ধরণের প্রশ্নের জন্য সর্বদা কন্টেনস পদ্ধতি ব্যবহার করি। আমি আপনার উত্তর দেখে কৌতূহল পেয়েছিলাম এবং অভ্যন্তরীণ বাস্তবায়ন পরীক্ষা করে দেখেছি যে ইন্টারসেক্ট সেট ব্যবহার করে। আপনি এই দুটি পদ্ধতির মধ্যে পারফরম্যান্স পার্থক্য বলতে পারেন?
পুনর্জাতক

6
@ রিওরনেক্স: Containsবার বার ব্যবহার করে ও (এক্স * ওয়াই) অপারেশন হিসাবে সময় মতো শেষ হয় তবে ও (1) মহাশূন্যে, যেখানে x প্রথম সংগ্রহের আকার এবং y দ্বিতীয় আকারের হয়। Intersectসময় মতো ও (এক্স + ওয়াই) ব্যবহার করা হয় তবে মহাশূন্যে ও (ওয়াই) - এটি দ্বিতীয় সংগ্রহ থেকে একটি হ্যাশসেট তৈরি করে, যা প্রথম সংগ্রহ থেকে কোনও আইটেমের অন্তর্ভুক্তির জন্য এটি দ্রুত পরীক্ষা করে তোলে। দেখুন codeblog.jonskeet.uk/2010/12/30/... বিস্তারিত জানার জন্য
জন স্কিট

1
পছন্দ করেছেন আমি আশা করবো যে উত্তরোত্তরটি খুব সামান্য দ্রুত হবে, কারণ এতে কম দিকনির্দেশ নেই।
জন স্কিটি

60

আপনি এর জন্য একটি Containsপ্রশ্ন ব্যবহার করতে পারেন :

var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));

5

আপনি যদি এর HashSetপরিবর্তে Listব্যবহার করেন তবে listofGenresআপনি এটি করতে পারেন:

var genres = new HashSet<Genre>() { "action", "comedy" };   
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));

3

আমার ধারণা, এটি কি এভাবেও সম্ভব?

var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x));

পারফরম্যান্স বা স্বচ্ছতার অর্থে "টেকহাইল" কি "কোথায়" এর চেয়ে খারাপ?


TakeWhileএকটি পৃথক ফাংশন - এটি কোনও মিল খুঁজে না পেয়ে পুনরাবৃত্তি থামিয়ে দেবে।
ডি স্ট্যানলে

1

বা এই মত

class Movie
{
  public string FilmName { get; set; }
  public string Genre { get; set; }
}

...

var listofGenres = new List<string> { "action", "comedy" };

var Movies = new List<Movie> {new Movie {Genre="action", FilmName="Film1"},
                new Movie {Genre="comedy", FilmName="Film2"},
                new Movie {Genre="comedy", FilmName="Film3"},
                new Movie {Genre="tragedy", FilmName="Film4"}};

var movies = Movies.Join(listofGenres, x => x.Genre, y => y, (x, y) => x).ToList();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.