3

VB.Netにウィンドウアプリケーションがあります。私は次のクラスと列挙型を持っています。

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)プロパティがあります。1つPageは複数ある場合があり、異なるモードで複製することPageItemPageItem.ItemNameできます。たとえば、アプリケーションにはPageItemwithMode1とを含めることができますMode2(ここでは、アイテムが含まれている可能性があり、アイテムが含まれている可能性があります)Mode1Page(0)Mode2Page(1)

私の質問は、LINQを使用してプロパティとプロパティの両方を持つPageItems List(同じ)を見つける方法です。ItemNameMode1Mode2List(Of Page)

例:

ページ1には3つのアイテム{Item1、Mode1}、{Item2、Mode1}、{Item3、Mode2}があります

ページ2には2つのアイテム{Item1、Mode2}、{Item4、Mode1}があります

ここでは、モードとのPageItems両方を持つリストが必要です。上記の場合、結果は次のようになります(両方を持つ)Mode1Mode2{Item1, Mode1}, {Item1, Mode2}Item1Modes

4

3 に答える 3

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は、入手可能な情報を減らしていることに注意してください。削除すると、各グループのページも表示されます。

これをテストするために、(列挙に新しいものを追加する代わりに)使用した以外のデータセットを使用Item3Mode2、に変更しMode3たコメントで質問への回答をテストしました。これにより、上記の2つのグループが返されます。答え。Item4Item3

「のみ取得する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
于 2012-09-17T01:08:52.680 に答える
0

私が正しく理解していれば、これでうまくいくと思います。タイプmode1およびmode2のページアイテムを含むすべてのページを返す必要があります。これまでに何を試しましたか?

from p in pages
where p.PageItems.Any(i => i.mode == Mode1) && p.PageItems.Any(i => i.mode == Mode2)
select p
于 2012-09-14T10:18:59.627 に答える
0

次のコードを試すことができます。

ページを薄暗くして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クラスは、サンプルコードから取得されます。最後の行はあなたに望ましい結果を与えるでしょう。

于 2012-09-18T15:10:01.323 に答える