我有一个商店列表(类型为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/

10-13 06:24