如何使用子列表(在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”
答案 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。