我在VB.Net中有Window Application。我有以下 class 和枚举。

Public Class Page
    Public Property Name As String
    Public Property PageItems As List(Of PageItem)
End Class


Public Class PageItem
    Public Property ItemName As String
    Public Property mode As Mode
End Class

Public Enum Mode
    Mode1
    Mode2
End Enum

在我的应用程序中,我有一个List(Of Page)属性。一个Page可以具有多个PageItem,并且PageItem.ItemName可以使用不同的模式进行复制。例如应用程序可以具有带有PageItemMode1Mode2(这里Mode1项可能在Page(0)中,而Mode2项可能在Page(1)中)

我的问题是如何使用LINQ从PageItems属性中找到同时具有ListItemNameMode1 Mode2(相同List(Of Page))?

例:

第1页有3个项目{Item1,Mode1},{Item2,Mode1},{Item3,Mode2}

第2页有2个项目{Item1,Mode2},{Item4,Mode1}

在这里,我想要一个同时具有PageItemsMode1模式的Mode2列表。在上述情况下,结果应为{Item1, Mode1}, {Item1, Mode2}(Item1同时具有Modes)

最佳答案

当您需要“PageItems组”时,我采用了这种方法:

From p In pages From pi In p.PageItems _
 Group By pi.ItemName Into Group _
 Where (New Mode(){Mode.Mode1, Mode.Mode2}).All(Function(m) _
               (From pig In Group Where pig.pi.Mode = m).Any) _
 Select ItemName, PageItems=(From pig In Group Select pig.pi)

请注意,最后的Select减少了可用信息。如果删除它,您还将获得每个组的页面。

为了测试这一点,我使用了您的数据集,除了我使用Item3Mode2(而不是在枚举中添加新的Mode3),现在在注释中测试您问题的答案,我将Item4更改为Item3,因此有两个组返回我的上述答案。

“仅获取List(Of PageItems)”的答案只是对最后Select行的更改:
From p In pages From pi In p.PageItems _
 Group By pi.ItemName Into Group _
 Where (New Mode(){Mode.Mode1, Mode.Mode2}).All(Function(m) _
               (From pig In Group Where pig.pi.Mode = m).Any) _
 From pig In Group Select pig.pi

10-06 15:16