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)));