我有一个对象集合,其中每个对象都包含另一个对象集合。我需要找出最快的方法来检查它是否包含所有值List<string>
。检查每个包含另一个对象集合的对象集合是否包含通过LINQ的所有列表值<string>
下面是一个例子:
class Video {
List<Tag> Tags;
}
class Tag{
public Tag (string name){
Name = name;
}
string Name;
}
List<string> selectedTags = new List<string>();
selectedTags.Add("Foo");
selectedTags.Add("Moo");
selectedTags.Add("Boo");
List<Video> videos = new List<Video>();
// Case A
Video videoA = new Video();
videoA.Tags = new List<Tag>();
videoA.Tags.Add(new Tag("Foo"));
videoA.Tags.Add(new Tag("Moo"));
videos.Add(videoA);
videoA
不应通过LINQ来选择,因为它不包含的所有标签。
// Case B
Video videoB = new Video();
videoB.Tags = new List<Tag>();
videoB.Tags.Add(new Tag("Foo"));
videoB.Tags.Add(new Tag("Moo"));
videoB.Tags.Add(new Tag("Boo"));
videos.Add(videoB);
videoB
应可以通过LINQ,因为它包含的所有标签中选择。
我试过用foreach
循环,但它太慢了,所以我正在寻找一个LINQ解决方案。
foreach (Video video in videos) {
if (video.Tags.Count() > 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);
}
}
产生的LINQ应该是这样的:
IEnumerable<Video> = from vid in videos
where vid.Tags.(..I dont know..)
select vid;
我试过多种方式与.Any
,.All
,等等。但我不能找到解决办法,我不能用.Intersect
因为一个是字符串的List
,另一个是对象的List
。请注意,在生产版本中,Video
和Tag
元素有更多的属性。
是标签的顺序重要还是你将这些视为集合? –
没有顺序并不重要 –