C# Linq嵌套收集过滤器

C# Linq嵌套收集过滤器,c#,linq,C#,Linq,我有品牌和区域视图模型,其中包含各自的Ids。 品牌视图模型有一组区域 public class BrandViewModel { public int Id { get; set; } private ObservableCollection<AreaViewModel> _areas; public ObservableCollection<AreaViewModel> Areas { get { return _ar

我有
品牌
区域
视图模型,其中包含各自的
Id
s。
品牌
视图模型有一组
区域

public class BrandViewModel
{
    public int Id { get; set; }
    private ObservableCollection<AreaViewModel> _areas;

    public ObservableCollection<AreaViewModel> Areas
    {
        get { return _areas; }
        set { Set(() => Areas, ref _areas, value); }
    }
}

可枚举
Any
Intersect
的Linq方法在这里很方便:

filteredBrandViewModels = brandViewModels.Where(b =>
    b.Areas.Select(a=>a.Id).Intersect(SelectedAreas.Select(sa => sa.Id).Any()
)

您可以用
任何
替换内部
中的

filteredBrandViewModels = brandViewModels.Where(b => 
    b.Areas.Any(a => SelectedAreas.Select(sa => sa.Id).Contains(a.Id)));
然后您还可以将
选择更改为:

filteredBrandViewModels = brandViewModels.Where(b => 
    b.Areas.Any(a => SelectedAreas.Any(sa => sa.Id == a.Id)));
最后,如果有大量数据,我建议将
SelectedAreas
中的ID作为
HashSet
进行搜索,因此搜索将是
O(n)
操作,而不是
O(n^2)

var hash=newhashset(SelectedAreas.Select(s=>s.Id));
filteredBrandViewModels=brandViewModels.Where(b=>b.Areas.Any(a=>hash.Contains(a.Id));

@Janis S.-哈哈,太快了。只是很快也看到了最后的建议谢谢,我和这个坐了一会儿。也适用于使用
O(1)
@JanisS的额外里程。-请参阅关于时间的更正-
O(1)
适用于每个
包含的
。迭代集合时,它将是
O(n)
(而不是
O(n^2)
filteredBrandViewModels = brandViewModels.Where(b => 
    b.Areas.Any(a => SelectedAreas.Any(sa => sa.Id == a.Id)));
var hash = new HashSet<int>(SelectedAreas.Select(s => s.Id));
filteredBrandViewModels = brandViewModels.Where(b => b.Areas.Any(a => hash.Contains(a.Id)));