title: check if collection of objects where each contain another collection of objects contain all values of List<string> via LINQ
body: <p>I have a collection of objects where each object contains another collection of objects. I need to find out the fastest way to check if it contains all values of <code>List&lt;string&gt;</code>.</p>
  
  <p>Here is an example:</p>
  
  <pre><code>class Video {        
    List&lt;Tag&gt; Tags; 
  }
  
  class Tag{
    public Tag (string name){
      Name = name;
    }
  
    string Name;
  }
  
  List&lt;string&gt; selectedTags = new List&lt;string&gt;();
  selectedTags.Add("Foo");
  selectedTags.Add("Moo");
  selectedTags.Add("Boo");
  
  List&lt;Video&gt; videos = new List&lt;Video&gt;();
  
  // Case A
  Video videoA = new Video();
  videoA.Tags = new List&lt;Tag&gt;();
  videoA.Tags.Add(new Tag("Foo"));
  videoA.Tags.Add(new Tag("Moo"));
  videos.Add(videoA);  
  </code></pre>
  
  <p><code>videoA</code> <strong>should not</strong> be selected by LINQ because it doesn't contain all tags.</p>
  
  <pre><code>// Case B
  Video videoB = new Video();
  videoB.Tags = new List&lt;Tag&gt;();
  videoB.Tags.Add(new Tag("Foo"));
  videoB.Tags.Add(new Tag("Moo"));
  videoB.Tags.Add(new Tag("Boo"));
  videos.Add(videoB);  
  </code></pre>
  
  <p><code>videoB</code> <strong>should</strong> be selected by LINQ because it contains all tags.</p>
  
  <p>I tried this with <code>foreach</code> loops, but it's too slow so I'm looking for a LINQ solution.</p>
  
  <pre><code>foreach (Video video in videos) {
    if (video.Tags.Count() &gt; 0) {
      bool containAllTags = true;
      foreach (string tagToFind in selectedTags) {
        bool tagFound = false;
        foreach (Tag tagItem in video.Tags) {
          if (tagToFind == tagItem.Name)
            tagFound = true;
        }
        if (!tagFound)
          containAllTags = false;
      }
      if (containAllTags)
        result.Add(videoItem);
    }
  }
  </code></pre>
  
  <p>The resulting LINQ should look like this:</p>
  
  <pre><code>IEnumerable&lt;Video&gt; = from vid in videos
                       where vid.Tags.( ..I dont know.. )
                       select vid;
  </code></pre>
  
  <p>I tried several ways with <code>.Any</code>, <code>.All</code>, etc.. but I can't find the solution and I can't use <code>.Intersect</code> because one is a <code>List</code> of strings and the other is a <code>List</code> of objects. Note that in the production version, <code>Video</code> and <code>Tag</code> elements have many more properties.</p>