在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中。它可以作为一种排序方法来完成,但结果列表需要保留首字母缩略词的原始值。
答案 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 - 我很快就这样做了,我不确定我是否正确地创造了这个属性,但我相信它应该是你想要的),