我在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
可以使用不同的模式进行复制。例如应用程序可以具有带有PageItem
和Mode1
的Mode2
(这里Mode1
项可能在Page(0)
中,而Mode2
项可能在Page(1)
中)我的问题是如何使用LINQ从
PageItems
属性中找到同时具有List
和ItemName
的Mode1
Mode2
(相同List(Of Page)
)?例:
第1页有3个项目{Item1,Mode1},{Item2,Mode1},{Item3,Mode2}
第2页有2个项目{Item1,Mode2},{Item4,Mode1}
在这里,我想要一个同时具有
PageItems
和Mode1
模式的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
减少了可用信息。如果删除它,您还将获得每个组的页面。为了测试这一点,我使用了您的数据集,除了我使用
Item3
和Mode2
(而不是在枚举中添加新的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