2013-06-05 1 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 

"에" "A"다음에해야하기 때문에.

약어는 약어를 사용해야하지만, 약어가없는 경우 Fullname을 사용해야합니다. 결과에 FullName 값을 두어 사용할 수 없습니다. 그것은 정렬 방법으로 할 수 있지만 결과 목록은 머리 글자 어의 원래 값을 유지해야합니다.

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

그런 다음 당신이 당신 LINQ를 변경 해당 속성보다는 _Acronym에 따라 정렬 : 뭔가의 라인을 따라 - 클래스에 추가 속성을 추가하는 방법에 대한 어떤

+0

보다 다른 또는 더 나은 방법이 VB.NET의 IF 기능을 사용할 수 있습니다 = (ItemList By In String.Format ("{0} {2} {1}", l._Acronym, l._FullName, IIf (I. Isron은 아무것도 아님, "-", ""))). ToList – forX

답변

0

C#

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

VB.NET itemList에 :

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

OP는 VB.NET을 요구하지 않았다. C# –

+0

나는 C#을 좋아한다. 이것은 VB를 요구한다. -1. –

+0

VB.net 버전 –

0

.

그게 당신을 위해 일하겠습니까 ?? (PS - 나는 내가 믿는, 나는 제대로 그 속성을 만들어 모르겠지만, 그것은 당신이 찾고있는 무엇을해야, 정말 빨리 이런 짓을)

+0

분류기가 주문과 함께 호출되지 않았습니다 – forX

+0

이해가 안 돼요. 이걸 시도해보십시오. 내가 준 속성을 추가하고 linq 문을 'itemList = (ItemList Order from l.Sorter) .ToList'로 변경합니다. 나는 지금 그것을 테스트했고 효과가 있었다. ... –

1

당신은

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

그것의 나의 첫번째 코멘트 그러나 짧은 것 같이, 나는 왜 나가 그것을 생각하지 않은지 모른다. itemList = (ItemList에서 Order from IIf (l._Acronym은 Nothing, l._FullName, l._Acronym)입니다.) ToList – forX

+0

@forX 나는'If'에서'IIf'를 선호합니다. 단락되어 있으며 강하게 입력되었습니다. –