我有一个商店列表(类型为ObservableCollection<Store>
),该Store
对象具有一个称为功能的属性(类型为List<Feature>
)。并且Feature
对象具有Name属性(类型为string
)。
回顾一下,具有功能列表的商店列表
我有DesiredFeatures的第二个集合(类型为List<string>
)。
我需要使用LINQ给我仅具有所有DesiredFeatures的商店的结果。到目前为止,我只能够提出一个给我一个OR结果而不是AND的查询。
看起来像这样:var q = Stores.Where(s=> s.Features.Any(f=> DesiredFeatures.Contains(f.name)));
我知道Intersect
可以提供帮助,这是我的使用方法:var q = Stores.Where(s => s.Features.Intersect<Feature>(DesiredFeatures));
这是我遇到的问题,相交需要一个Feature
对象,我需要相交的对象位于Feature.Name上。
目标是最终得到一个ObservableCollection,其中每个商店都具有所有DesiredFeatures。
谢谢!
最佳答案
我需要使用LINQ给我仅具有所有DesiredFeatures的商店的结果。
换句话说,每个所需功能都必须具有匹配的存储功能。
在这种情况下,我看不到Intersect
有什么帮助。将上述标准直接转换为LINQ就像这样:
var q = Stores.Where(s =>
DesiredFeatures.All(df => s.Features.Any(f => f.Name == df))
);
一种更有效的方法是使用GroupJoin进行匹配:
var q = Stores.Where(s =>
DesiredFeatures.GroupJoin(s.Features,
df => df, sf => sf.Name, (df, sf) => sf.Any()
).All(match => match)
);
或Except检查不匹配的项目:
var q = Stores.Where(s =>
!DesiredFeatures.Except(s.Features.Select(sf => sf.Name)).Any()
);
关于c# - LINQ在内部集合上相交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35785583/