vb.net - 使用 LINQ 从 List(of ParentObject) 中查找重复的子项

标签 vb.net linq

我在 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 可以用不同的模式复制。例如应用程序可以有一个带有 Mode1Mode2PageItem(这里 Mode1 项可能在 Page 中(0)Mode2 项目可能在 Page(1))

我的问题是如何找到同时具有 Mode1List(相同的 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 列表,它同时具有模式 Mode1Mode2。在上面的例子中,结果应该是 {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

关于vb.net - 使用 LINQ 从 List(of ParentObject) 中查找重复的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421690/

相关文章:

sql-server - 为什么 SSIS vb 脚本在 VS 中执行时正确检测到文件存在,而不是从 SQL Server 中执行

vb.net - 如何在 ULong 上使用按位运算设置大常数?

c# - 使用两个条件拆分字符串

c# - 如何用表达式调用 SqlFunctions.PatIndex()?

c# - XDocument.Element 在解析 xml 字符串时返回 null

vb.net - VB.net 中 ADODB 和 SqlClient 之间的主要区别是什么

c# - FindFirstFile 与 IO.Directory.GetFiles

c# - winforms 或 wpf 应用程序的脚手架功能

c# - LINQ 和 EF6 : The context cannot be used while the model is being created

c# - 这个 LINQ 示例的复杂性是什么?