我有一个项目对象列表:
IEnumerable<Project> projects项目类作为一个名为标记的属性。这是int[]
我有一个名为filteredTags的变量,它也是int[]。
因此,假设我的筛选标记变量如下所示:
int[] filteredTags = new int[]{1, 3};我希望将我的列表( projects )筛选为只返回具有筛选器中列出的所有标记的项目(在本例中,至少在标记属性中有标记1和标记3)。
我试图使用,其中()和包含(),但这似乎只有当我比较单个值时才有效。如何将列表与需要匹配筛选列表中所有项的另一个列表进行比较?
发布于 2011-02-23 12:05:59
编辑:更好的做法是这样做:
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,否则计数比较将无法像预期的那样工作。
发布于 2011-02-23 12:40:18
我们应该有包含(至少)所有过滤标签的项目,或者用不同的方式说,排除那些不包括所有过滤标记的项目。因此,我们可以使用Linq Except来获取那些不包括的标记。然后,我们可以使用Count() == 0只有那些不排除标记的:
var res = projects.Where(p => filteredTags.Except(p.Tags).Count() == 0);或者我们可以通过用Count() == 0替换!Any()来稍微加快速度。
var res = projects.Where(p => !filteredTags.Except(p.Tags).Any());发布于 2011-02-23 12:01:07
var result = projects.Where(p => filtedTags.All(t => p.Tags.Contains(t)));https://stackoverflow.com/questions/5090568
复制相似问题