РЕДАКТИРОВАТЬ: еще лучше, сделайте это так:
var filteredProjects =
projects.Where(p => filteredTags.All(tag => p.Tags.Contains(tag)));
РЕДАКТИРОВАТЬ2: Честно говоря, я не знаю, какой из них лучше, поэтому, если производительность не критична, выберите тот, который вы считаете болееудобочитаемый.Если это так, вам придется как-то его тестировать.
Вероятно, Intersect
- это путь:
void Main()
{
var projects = new List<Project>();
projects.Add(new Project { Name = "Project1", Tags = new int[] { 2, 5, 3, 1 } });
projects.Add(new Project { Name = "Project2", Tags = new int[] { 1, 4, 7 } });
projects.Add(new Project { Name = "Project3", Tags = new int[] { 1, 7, 12, 3 } });
var filteredTags = new int []{ 1, 3 };
var filteredProjects = projects.Where(p => p.Tags.Intersect(filteredTags).Count() == filteredTags.Length);
}
class Project {
public string Name;
public int[] Tags;
}
Хотя на первый взгляд это кажется немного уродливым.Сначала вы можете применить Distinct
к filteredTags
, если вы не уверены, являются ли все они уникальными в списке, иначе сравнение подсчетов не будет работать должным образом.