我有RefersTo:=Range("Sales"!$A$" & rngCell.Row)
和Brand
个查看模型,其中包含各自的Area
。
Id
视图模型的集合为Brand
。
Areas
我有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); }
}
}
个集合,其SelectedAreas
与Id
匹配。
我收集了AreaViewModel
。我希望得到BrandViewModel
的集合,该集合由选定区域过滤。
尝试下面的陈述,但BrandViewModel
条款需要一个bool条件。
Where
答案 0 :(得分:2)
您可以将内部Where
替换为Any
:
filteredBrandViewModels = brandViewModels.Where(b =>
b.Areas.Any(a => SelectedAreas.Select(sa => sa.Id).Contains(a.Id)));
然后您还可以将Select
更改为:
filteredBrandViewModels = brandViewModels.Where(b =>
b.Areas.Any(a => SelectedAreas.Any(sa => sa.Id == a.Id)));
最后,如果有大量数据,我建议将SelectedAreas
的ID设为HashSet<int>
,以便搜索O(n)
而不是O(n^2)
{1}}:
var hash = new HashSet<int>(SelectedAreas.Select(s => s.Id));
filteredBrandViewModels = brandViewModels.Where(b => b.Areas.Any(a => hash.Contains(a.Id)));
答案 1 :(得分:0)
可枚举Any
和Intersect
的Linq方法将非常方便:
filteredBrandViewModels = brandViewModels.Where(b =>
b.Areas.Select(a=>a.Id).Intersect(SelectedAreas.Select(sa => sa.Id).Any()
)