Как использовать vb-эквивалент ++ для свойства индекса в запросе Linq, проецирующем новый тип - PullRequest
1 голос
/ 03 мая 2011

Обычно я делаю это в C #, но так как мне нужно получить этот код в этой конкретной сборке, которая является vb.net, я застрял.

Вот мой запрос linq:

Dim i As Integer = 0

Dim oldAndCurrentIntersectionOnNames = From currentApplicant In currentApplicants _
                                    Group Join oldApplicant In oldApplicants _
                                        On _
                                        New With {Key .FirstName = currentApplicant.FirstName, _
                                                    Key .LastName = currentApplicant.LastName} _
                                            Equals _
                                        New With {Key .FirstName = oldApplicant.FirstName, _
                                                    Key .LastName = oldApplicant.LastName} Into applicants = Group _
                                    From applicant In applicants.DefaultIfEmpty(New ApplicantNameDetails()) _
                                    Select New ApplicantNameDetails() With _
                                    { _
                                        .Index = i+=1, _
                                        .FirstName = CStr(IIf(Not currentApplicant.FirstName Is Nothing, currentApplicant.FirstName, Nothing)), _
                                        .OldFirstName = CStr(IIf(Not applicant.FirstName Is Nothing, applicant.FirstName, Nothing)), _
                                        .LastName = CStr(IIf(Not currentApplicant.LastName Is Nothing, currentApplicant.LastName, Nothing)), _
                                        .OldLastName = CStr(IIf(Not applicant.LastName Is Nothing, applicant.LastName, Nothing)) _
                                    }

Вы увидите .Index = i + = 1

Это была моя попытка сделать то, что я с радостью сделал бы в C # (то есть Index = i ++) в VB.К сожалению, компилятору VB это не нравится.

Кто-нибудь получил какие-либо предложения относительно того, как я могу сделать это в VB.

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

По сути, вы не можете. Если вы хотите, чтобы запрос Linq получал последовательные значения, используйте специальный (так называемый «генератор») класс, у которого есть метод IncrementAndGet (или просто Next) для вашего целого числа.

class IntegerGenerator
    private state as integer = 0

    public function Next() as integer
        dim oldState = state
        state += 1
        return oldState
    end function
end class
1 голос
/ 03 мая 2011

Существует перегрузка метода Select, который позволяет использовать индекс элемента в наборе результатов. http://msdn.microsoft.com/en-us/library/bb534869.aspx

Вы можете разделить ваш запрос на две части, чтобы использовать его (не проверено)

Dim q = From currentApplicant In currentApplicants _
        Group Join oldApplicant In oldApplicants On _
                   New With {Key.FirstName = currentApplicant.FirstName, _
                             Key.LastName = currentApplicant.LastName} _
                   Equals _
                   New With {Key.FirstName = oldApplicant.FirstName, _
                             Key.LastName = oldApplicant.LastName} Into applicants = Group _
        From applicant In applicants.DefaultIfEmpty(New ApplicantNameDetails())


Dim oldAndCurrentIntersectionOnNames = _
q.Select(Function(x, i) New ApplicantNameDetails() With _
         { _
             .Index = i, _
             .FirstName = CStr(IIf(Not x.currentApplicant.FirstName Is Nothing, x.currentApplicant.FirstName, Nothing)), _
             .OldFirstName = CStr(IIf(Not x.applicant.FirstName Is Nothing, x.applicant.FirstName, Nothing)), _
             .LastName = CStr(IIf(Not x.currentApplicant.LastName Is Nothing, x.currentApplicant.LastName, Nothing)), _
             .OldLastName = CStr(IIf(Not x.applicant.LastName Is Nothing, x.applicant.LastName, Nothing)) _
         })         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...