使用LINQ过滤列表

leo*_*ora 44 c# linq tags collections ienumerable

我有一个项目对象列表:

IEnumerable<Project> projects
Run Code Online (Sandbox Code Playgroud)

一个工程类的所谓财产标签.这是一个int []

我有一个名为filteredTags的变量,它也是一个int [].

所以我要说我的过滤标签变量如下所示:

 int[] filteredTags = new int[]{1, 3};
Run Code Online (Sandbox Code Playgroud)

我想过滤我的列表(项目),只返回过滤器中列出的所有标签的项目(在这种情况下,至少标签1和标签属性中的标签 3 ).

我试图使用Where()和Contains(),但这似乎只有在我与单个值进行比较时才有效.我如何将列表与另一个列表进行比较,我需要匹配筛选列表中的所有项目?

Dyp*_*ppl 49

编辑:更好的是,这样做:

var filteredProjects = 
    projects.Where(p => filteredTags.All(tag => p.Tags.Contains(tag)));
Run Code Online (Sandbox Code Playgroud)

编辑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;
}
Run Code Online (Sandbox Code Playgroud)

虽然起初看起来有点难看.您可以先申请DistinctfilteredTags,如果你不知道他们是否是列表中的所有独特的,否则如预期的计数的比较将无法工作.