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

时间:2012-09-14 09:28:23

标签: vb.net linq

我在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可能有多个PageItemPageItem.ItemName也可以使用不同的模式进行复制。例如应用可以有PageItem Mode1Mode2Mode1项可能在Page(0)Mode2项目可能位于{{} 1}})

我的问题是如何查找Page(1) PageItems(同一List),ItemNameMode1属性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

3 个答案:

答案 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类取自您的示例代码。最后一行将为您提供所需的结果。