Представьте себе систему маркировки фотографий...
public class Photo
{
public IList<Tag> Tags {get;set;}
}
public class Tag
{
public string Name {get;set;}
}
IList<Tag> tags = new [] {
new Tag{Name = "tag1"},
new Tag{Name = "tag2"}
};
IList<Photo> photos = GetAllPhotos();
И эта строка:
var results = //return photos when Photo.Tags contains BOTH tags
Можно ли использовать LINQ-оператор для этого?
Конечно:
// All the tags in "tags" are contained in p.Tags
var results = photos.Where(p => tags.All(tag => p.Tags.Contains(tag)));
или
// All the "tags" except the ones in p.Tags ends up as an empty set
var results = photos.Where(p => !tags.Except(p.Tags).Any());
EDIT: Обратите внимание, что это предполагает, что на самом деле у вас есть соответствующая реализация равенства в Tag. В противном случае вам понадобится что-то вроде:
var results = photos.Where(p => !tags.Select(t => t.Name)
.Except(p.Tags.Select(t => t.Name)).Any());
photos.Where(p => t.Tags.Contain(tags[0]) && t.Tags.Contains(tag[1]));
Его трудно узнать, какие операторы Tag
имеют.
tag[0]
должен быть tag[0]
tags[1]
?