c# - 使用 LINQ 过滤列表

标签 c# linq collections tags ienumerable

我有一个项目对象列表:

IEnumerable<Project> projects

Project 类作为称为Tags 的属性。这是一个int[]

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

假设我的过滤标签变量看起来像这样:

 int[] filteredTags = new int[]{1, 3};

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

我试图使用 Where() 和 Contains() 但这似乎只有在我与单个值进行比较时才有效。我将如何执行此操作以将一个列表与另一个列表进行比较,而我需要对过滤列表中的所有项目进行匹配??

最佳答案

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

var filteredProjects = 
    projects.Where(p => filteredTags.All(tag => p.Tags.Contains(tag)));

EDIT2:老实说,我不知道哪个更好,所以如果性能不重要,请选择您认为更具可读性的那个。如果是,则必须以某种方式对其进行基准测试。


可能 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,否则计数比较将无法按预期进行。

关于c# - 使用 LINQ 过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090568/

相关文章:

c# - Form.Location 不起作用

c# - 桌面应用程序的推送通知

c# - 如何创建子对象的 Expression.Property

vba - 我需要实现什么接口(interface)才能允许 VBA 中的 ForEach 作用于用 delphi 编写的 COM 对象?

c# - C# 中的数组逗号分隔输出值

c# - 使用替换时正则表达式删除空格

c# - 将 List<MyObject> 转换为字典 <obj.string, List<obj.ID>>

c# - 没有任何内容添加到对象列表中

java - 吝啬的链接结构和节点?

java - 这个关于 map 和 Collection 的作业的答案是什么?