PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net |

LINQ| Select

Select는 특별한 작업을 지정하지 않으면 생략해도 된다
작업을 지정해 보자

        Dim oQ = From Q In sX
                Take 10
                Select Q & "*****"

sX집합체(배열)에서 앞에서 부터 10개를 선택하여 (Take 10)
결과는 각 요소에 문자열 "*****" 를 붙여서 내보낸다(Select Q & "*****")
인것이다
Select를 생략하면 그냥 집합체의 요소 Q값이 결과로 모여지는것
마음대로 융통성있게 새로운 서식으로 만들어 낼수 있다

		Dim oQ = From Q In sX
                Take 10
                Select String.Format("Value=|{0}|", Q)

Select String.Format("Value=|{0}",Q)
물론 이것은 LINQ의 키워드가 아니고, 이것은 .Net의 String개체에서
제공하는 서식메소드이다

Select 에서 처리하기가 복잡하면 다른 함수를 만들어서 호출하면 된다
이것은 앞 페이지, Delegate부분에 에서 개념과 관련된 표현들 이다

 Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
		....
		....
        Dim oQ = From Q In sX
                Take 10
                Select getMore(Q)
		
		....
		....
		....
    End Sub
    Function getMore(sX As String)
        Dim iQ As Integer = sX
        Dim sNew As String = ""
        Select Case iQ
            Case 1 To 20 : sNew = "A_"
            Case 21 To 40 : sNew = "B_"
            Case 41 To 60 : sNew = "C_"
	Case 61 To 80 : sNew = "D_"
            Case Else : sNew = "E_"

        End Select
        Return sNew & String.Format("{0:000}", iQ)

    End Function

.Net|Anonymous Object

VB.Net은 크래스, 개체가 중심이다
그런 개체중에 이름없는 개체(Anonymous Object)라고 하는 것이 있다
개체를 만들려면 크래스모듈을 만들고, 속성,메소드를 만들어서 사용하지만
그렇게 번거롭게 하지 말고 간단하게 사용할수 있는 이름없는 개체가 필요하지 않을까
그래서 Anonymous object라는 것이 제공된다
아래와 같이 LINQ로 집합체의 조건에 맞는 것을 골라서 새로운 집합체로
만드는 과정에서 어떤 값을 재가공하여 개체로 만들어서 내보내고 싶은 욕구는
개체에 익숙한 사람들이 원하는 작업이다

    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
		....
		....
        Dim oQ = From Q In sX
		Take 10
		Select New With {.first = Q / 2, .second = Q * 2}
		....
		....
    End Sub

그러면 결과 집합체의 요소를 아래와 같이 읽으면
익명의 개체의 속성을 다른 개체들과 같이 목록으로 볼수 있으니 편리하다



이것은 아래와 같이 전통적인 방식으로 Class를 만들고 하는 것과 같은 것
간단한 것은 크래스 선언없이 Anonymous Object로 하는 것이 매력적인것..


Class testClass
	Public first As Integer
	Public second As Integer
End Class
Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
	....
	Dim oQ = From Q In sX
			Take 10
			Select New testClass With {.first = Q / 2, .second = Q * 2}
	....
	.... 
End Sub

Anonymous Object는 크래스명이 없이 간략하게 만들어서 사용할수 있는 것
그럼 이것으로 만든 정보 100개를 List(Of Object)에 저장하고 LINQ로
처리해 아래와 같이 만들어 볼 수도 있을 것이다

 Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
        Dim oList As New List(Of Object)
        Dim oRandom As New Random
        For Each sX As String In Me.TextBox1.Text.Split(",")
            oList.Add(New With {.Alpha = Chr(oRandom.Next(65, 90)), .Num = CInt(sX)})
        Next

        Dim oQ = From Q In oList
                Where Q.alpha = "A" Or Q.alpha = "M"
                Order By Q.alpha
                Select Q

        Dim sY As String = ""

        oQ.ToList.ForEach(Sub(x) sY &= (x.alpha & "  " & x.num) & vbNewLine)
        MsgBox(sY)
End Sub

anonymouse object를 생성하여 집합체에 모으려면 데이타타입은 Object 이다
그래서 Dim oList= New List(Of Object) 로 한다

***[LOG-IN]***

.Net|List(Of Object)

이제 데이타를 단순한 배열이 아닌 복잡한 데이타를 만들어 놓고
LINQ를 활용해 보도록 하자
Form이 로딩될때 전역 List개체 변수에 아래와 같이 랜덤으로 가상의 데이타를 만들어 담고..

Dim oList As List(Of Object) 
    Dim oRand As New Random 
	
    Sub fillData()
        oList = New List(Of Object)
        For iX As Integer = 1 To 500
            oList.Add(New With {.DataA = getData("A"), .DataB = getData("B"), .DataC = getData("C"), .DataE = getData("E")})
        Next
    End Sub
	
    Function getData(sType As String)
        Dim sX As String = ""
        Select Case sType
            Case "A"
                For iX As Integer = 1 To 4
                    sX &= Chr(oRand.Next(65, 90))
                Next
                Return sX
            Case "B"
                Return oRand.Next(1000, 10000)
            Case "C"
                Return DateTime.Today.Add(New TimeSpan(oRand.Next(1, 200), 0, 0)).ToShortDateString
            Case "E"
                Return Chr(oRand.Next(65, 70)) & "_" & oRand.Next(100, 200)

        End Select
        Return Nothing

    End Function

위의 프로시져는
아래와 같이 4개의 속성으로 익명의 개체를 랜덤으로 500개를 만들어서
oList(Of Object) 집합체에 담은것이다

XPGY 9401 2016-01-30 A_187

이것을 LINQ로 아주 마음대로 분석할수 있게 된다
이렇게 만든 것을 그림과 같이 텍스트박스에 나타나게 하고



마치 엑셀테이블에서 휠터,부분합,정렬등을 마음대로 하듯이

위와 같이 전역변수에 익명의 개체를 모은 집합체를 만든후
이것을 LINQ로 아래와 같이 처리하면..
위의 List(Of Object)에는 DataA,DataB,DataC,DataE라는 4개의 정보가
하나의 개체로 500개가 저장된 것
이것에서 DataA와 DataB만 골라내는데,
Select New With {.a = Q.dataa, .b = Q.datab}
조건은 DataA 정보의 첫문자는 A일 경우
그리고 정렬은 DataB속성값으로 하여 가져오게 한다
이때 가져오는 것을 지금까지 한, 문자열로 조합하여 가져 오게 하는 것이
아니고 또 다른 익명의 개체를 만들어서 가져오게 한다
\ 그리고 읽어낼때,만들었던 개체의 속성으로 읽어 낸다
"A value=" & x.a & " B value=" & x.b
몇개의 기능의 연습이다

  Dim oQ = From Q In oList
                Where Q.dataa.substring(0, 1) = "A"
                Order By Q.datab
                Select New With {.a = Q.dataa, .b = Q.datab}

        Dim sX As String = "전역변수의 익명의 개체 집합체에서 " & vbNewLine & _
                           "다른 익명의 집합체로 만들기" & New String(vbNewLine, 2)


        
        oQ.ToList.ForEach(Sub(x) sX &= "A value=" & x.a & " B value=" & x.b & vbNewLine)
        MsgBox(sX)



위에서 New String(vbNewline,2)는 워크시트함수의 REPT함수와 같은 결과이고
VBA함수인 String(2,vbNewLine) 와 같은 결과이다
문자열처리 메소드는 String개체에서 모두 제공된다

컴퓨터 프로그래밍은 정보의 재가공을 얼마나 융통성있게 잘하느냐이다
그러니 정보가공도구인 LINQ는 참으로 파워풀한 도구가 될것이다

LINQ|Enumerable.Range

1에서 부터 10까지 일련번호를 만들고 싶다면
순환문을 돌려야 할것이다
Enumerble개체의 Range메소드를 사용하면 간단하게 원하는 값의 집합체를 얻는다

 Dim oQ = From Q In Enumerable.Range(1, 10)
                 Order By Q Descending
                Select Q * 1000

Enumerable.Range(1,10) 메소드는 1에서 부터 10까지의
숫자를 집합체로 만들어준다..
이렇게 만든 집합체를 LINQ로 물론 처리할수 있는 것,
각요소의 값으로 내림차 정렬을 하고
각요소의 값에 1000을 곱하여 얻어내면,
1000,900,800,,,,과 같은 값을 10개 얻게 되겠지
또한 LINQ외부에 선언된 배열의 요소값을 가져다가 마치
자신의 집합체인 것 같이 처리도 한다

Dim sQ As String() = {"B", "Q", "Z", "M", "Y", "X", "A", "P", "B", "C"}
Dim oQ = From Q In Enumerable.Range(0, 9)
		 Order By sQ(Q)
		Select Q + 1 & "=" & sQ(Q)

***[LOG-IN]***