1

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

我有一个项目清单。每个 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 包含一个项目,其中 value = "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 的项目是唯一一个包含 listOfNiveau2 的项目,其中包含值“Value2”

4

1 回答 1

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。

于 2013-06-25T16:11:05.900 回答