Vb.net Linq特别订购

时间:2013-06-05 21:05:16

标签: vb.net linq

在vb.net Linq中,我想按值对列表进行排序,但如果值为null,则应使用其他值。

示例:

Class Item
    Public _Id As Integer
    Public _FullName As String
    Public _Acronym As String

    Public Sub New(ByVal id As Integer, ByVal fullName As String, ByVal acronym As String)
        Me._Id = id
        Me._FullName = fullName
        Me._Acronym = acronym
    End Sub
End Class

 Sub Main()
        Dim itemList As New List(Of Item)
        itemList.Add(New Item(1, "AZZ", "A"))
        itemList.Add(New Item(2, "BBB", "B"))
        itemList.Add(New Item(3, "FFF", "F"))
        itemList.Add(New Item(4, "An item", Nothing))

        itemList = (From l In itemList Order By l._Acronym).ToList

        For Each i In itemList
            Debug.Print(String.Format("{0}{2}{1}", i._Acronym, i._FullName, IIf(i._Acronym IsNot Nothing, " - ", "")))
        Next
    End Sub

此类结果:

An item
A - AZZ
B - BBB
F - FFF

我想要的结果:

A - AZZ
An item
B - BBB
F - FFF

因为“An”应该在“A”之后。

排序需要使用Acronym,但如果首字母缩略词什么都没有,它应该使用Fullname。 我们无法将FullName的值放入结果中的Acronym中。它可以作为一种排序方法来完成,但结果列表需要保留首字母缩略词的原始值。

3 个答案:

答案 0 :(得分:1)

C#

ItemList.OrderBy(x=>x._Acronym??x._FullName);

VB.NET

ItemList.OrderBy(Function(x) If(x._Acronym, x._FullName))

答案 1 :(得分:1)

您可以使用VB.NET的IF函数

itemList = (From l In itemList Order By If(l._Acronym Is Nothing, l._Id, l._Acronym)).ToList

答案 2 :(得分:0)

如何为您的课程添加额外的属性 - 以下内容:

Public ReadOnly Property Sorter As String
    Get
        If _Acronym Is Nothing Then Return _FullName Else Return _Acronym
    End Get
End Property

然后你只需将你的LINQ改为基于该属性而不是_Acronym进行排序。

那对你有用吗? (PS - 我很快就这样做了,我不确定我是否正确地创造了这个属性,但我相信它应该是你想要的),