我在 VB.Net 中有窗口应用程序。我有以下类(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
可以用不同的模式复制。例如应用程序可以有一个带有 Mode1
和 Mode2
的 PageItem
(这里 Mode1
项可能在 Page 中(0)
和 Mode2
项目可能在 Page(1)
)
我的问题是如何找到同时具有 Mode1
和
?List
(相同的 ItemName
)使用 LINQ 从 List(Of Page)
属性获取 code>Mode2
例子:
Page 1 has 3 Items {Item1, Mode1}, {Item2,Mode1}, {Item3,Mode2}
Page 2 has 2 Items {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
关于vb.net - 使用 LINQ 从 List(of ParentObject) 中查找重复的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421690/