linq子列表vb.net,按子值排序

时间:2013-06-25 14:49:16

标签: vb.net linq

如何使用子列表(在vb.net中)。

我有一个Item列表。每个Item都包含Item2的列表。我需要排序Item.ListOf(Item2).value包含“ValueX”的位置。

示例:

 Dim myList As New List(Of Niveau1)
        For i As Integer = 1 To 3
            Dim niv1 As New Niveau1(i)
            For j As Integer = i To i + 1
                niv1.listOfNiveau2.Add(New Niveau2(j))
            Next
            myList.Add(niv1)
        Next


Class Niveau1
    Public id As Integer
    Public listOfNiveau2 As List(Of Niveau2)
    Public Sub New(ByVal id As Integer)
        Me.listOfNiveau2 = New List(Of Niveau2)
        Me.id = id
    End Sub
End Class

Class Niveau2
    Public id As Integer
    Public value As String
    Public Sub New(ByVal id As Integer)
        Me.id = id
        Me.value = String.Format("Value{0}", id Mod 3)
    End Sub
End Class

实际结果是listOf(Niveau1)

我需要对列表进行排序(mylist)。结果首先是每个项目Niveau1,其中listOfNiveau2包含一个值为“Value0”的项目,之后是其他项目。

结果应该是这个列表:

Item 1 :
   id = 2
   listOfNiveau2 = 
            { id = 2, value = "Value1" }
            { id = 3, value = "Value0" }

Item 2 :
   id = 3
   listOfNiveau2 = 
            { id = 3, value = "Value0" }
            { id = 4, value = "Value1" }

Item 3 :
   id = 1
   listOfNiveau2 = 
            { id = 1, value = "Value1" }
            { id = 2, value = "Value2" }

第一个和第二个项目包含“Value0”它们的子列表,这就是为什么它们首先在列表中。我们在其后添加其他所有项目。在此示例中,我们只剩下1个项目。

如果我们想要字符串“Value2”而不是“Value0”。结果应该是:

Item 1 :
   id = 1
   listOfNiveau2 = 
            { id = 1, value = "Value1" }
            { id = 2, value = "Value2" }

Item 2 :
   id = 2
   listOfNiveau2 = 
            { id = 2, value = "Value1" }
            { id = 3, value = "Value0" }

Item 3 :
   id = 3
   listOfNiveau2 = 
            { id = 3, value = "Value0" }
            { id = 4, value = "Value1" }

因为id = 1的Item是唯一包含listOfNiveau2的Item,其中包含值“Value2”

1 个答案:

答案 0 :(得分:3)

好的,我最终得到了它......

myList.OrderBy(Function(x) x.id).ThenBy(Function(x) If(x.listOfNiveau2.Any(Function(y) y.value = "Value2"), 0, 1))

你可以用变量替换“Value2”,它应该可以工作。

以防万一...它通过在Int32(0,1)上排序来工作,这是通过查看List是否包含任何带有您传入的值的niveau2来确定的。我已经测试了它并且它似乎工作正常。如果您有任何问题,请告诉我。

我可以预见到Id先没有排序的列表会不按时返回项目,因此我也添加了OrderBy.ThenBy。