我在VB.Net中有Window Application。我有以下课程&枚举。
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
项目可能位于{{} 1}})
我的问题是如何查找Page(1)
PageItems
(同一List
),ItemName
和Mode1
属性Mode2
属性List(Of Page)
使用LINQ?
示例:
第1页有3个项{Item1,Mode1},{Item2,Mode1},{Item3,Mode2}
第2页有2个项{Item1,Mode2},{Item4,Mode1}
在这里,我想要一个PageItems
列表,其中包含模式Mode1
和& Mode2
。在上述情况下,结果应为{Item1, Mode1}, {Item1, Mode2}
(Item1
同时具有Modes
)
答案 0 :(得分:1)
当你需要“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
答案 1 :(得分:0)
如果我理解正确,请认为应该这样做。它应该返回包含mode1和mode2类型的页面项的所有页面。到目前为止你尝试了什么?
from p in pages
where p.PageItems.Any(i => i.mode == Mode1) && p.PageItems.Any(i => i.mode == Mode2)
select p
答案 2 :(得分:0)
您可以尝试以下代码。
Dim pages As List(Of Page)= New List(Of Page)()
Dim page1 As Page = New Page()
page1.Name = "Page1"
page1.PageItems = New List(Of PageItem)()
Dim pageItem1 = New PageItem()
pageItem1.ItemName = "Item1"
pageItem1.mode = Mode.Mode1
page1.PageItems.Add(pageItem1)
Dim pageItem2 = New PageItem()
pageItem2.ItemName = "Item2"
pageItem2.mode = Mode.Mode1
page1.PageItems.Add(pageItem2)
Dim pageItem3 = New PageItem()
pageItem3.ItemName = "Item3"
pageItem3.mode = Mode.Mode2
page1.PageItems.Add(pageItem3)
pages.Add(page1)
Dim page2 As Page = New Page()
page2.Name = "Page2"
page2.PageItems = New List(Of PageItem)()
Dim pageItem4 = New PageItem()
pageItem4.ItemName = "Item1"
pageItem4.mode = Mode.Mode2
page2.PageItems.Add(pageItem4)
Dim pageItem5 = New PageItem()
pageItem5.ItemName = "Item4"
pageItem5.mode = Mode.Mode1
page2.PageItems.Add(pageItem5)
pages.Add(page2)
Dim ps = From p In pages From pi In p.PageItems Group pi By pi.ItemName Into gp = Group Where gp.Count() > 1 From pil In gp Select pil
Page,PageItem和Mode类取自您的示例代码。最后一行将为您提供所需的结果。