2013-06-05 15 views
0

В vb.net Linq, я хочу сортировать список по значению, но если значение равно null, оно должно использовать другое значение.Vb.net Linq order by special

Пример:

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 

Поскольку "" должно быть после того, как "А".

Сортировка следует использовать с помощью сокращения, но если аббревиатура - ничто, он должен использовать полное имя. Мы не можем поместить значение FullName в Акроним в результате. это может быть сделано как метод для сортировки, но в списке результатов необходимо сохранить исходное значение аббревиатуры.

+0

есть еще один или лучше, чем: ITEMLIST = (From l В itemList Order By String.Format ("{0} {2} {1}", l._Acronym, l._FullName, IIf (l._Acronym IsNot Nothing, "-", ""))). ToList – forX

ответ

0

C#

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

VB.NET

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

OP запросил у VB.NET не C# –

+0

Насколько мне нравится C#, это требует VB. -1. –

+0

Добавлена ​​версия VB.NET –

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 - я сделал это очень быстро, я не уверен, что я правильно создал эту собственность, но это должно быть то, что вы ищете, я считаю)

+0

Сортировщик не вызывается по заказу – forX

+0

Я не понимаю .. Попробуйте это. Добавьте в свойство, которое я дал вам, а затем измените ваш оператор linq на 'itemList = (From l В itemList Order by l.Sorter) .ToList'. Я тестировал его сейчас, и это сработало ... –

1

Вы можете использовать IF функция vb.net в

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

его, как мой первый комментарий, но короче, я не знаю, почему я об этом не думал. itemList = (From l В itemList Order by IIf (l._Acronym Is Nothing, l._FullName, l._Acronym)) ToList – forX

+0

@forX Я предпочитаю 'If'' 'IIf'. Он закорочен и строго типизирован –