VB.NET возвращает IEnumerable (Of IEnumerable (Of T)) при использовании оператора Group By LINQ - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь преобразовать реализацию INotifyDataErrorInfo Anthyme Caillard в VB.NET.Все идет хорошо, пока я не достигну метода Validate, который имеет следующий запрос LINQ, в котором q имеет тип IEnumerable<IGrouping<string, ValidationResult>>:

var q = from r in validationResults
        from m in r.MemberNames
        group r by m into g
        select g;

Я попробовал следующий перевод:

Dim q = From r In valResults
        From m In r.MemberNames
        Group r By r.MemberNames Into Group
        Select Group

Или даже версия лямбда-выражения (при условии, что я правильно использую синтаксис Джона Скита ):

Dim q = valResults.GroupBy(Function(r) r, Function(r) r.MemberNames)

, но в обоих случаях q - этотипа IEnumerable(Of IEnumerable(Of ValidationResult)).

Я рассмотрел VB и IGrouping для LINQ Query и VB.Net - Linq Group By возвращает IEnumerable (анонимного типа) ,но я не думаю, что они применимы, так как я буду работать с группой напрямую, а не со специализированным классом.

Почему эти реализации не возвращают одно и то же, и что я могу сделать, чтобы сделать q требуемый IEnumerable(Of IGrouping(Of String, ValidationResult))?

1 Ответ

0 голосов
/ 27 декабря 2018

Похоже, что компилятор VB обрабатывает синтаксис запроса LINQ, отличный от компилятора C #.

В C # выражение

from element in list
group element by element.Value

идентично

list.GroupBy(element => element.Value)

Однако в VB

From element In list
Group element By element.Value Into g = Group

переводится в

list.GroupBy(Function(element) element.Value,
             Function(key, element) New With { Key .Value = key, Key .g = element })

Я не вижу веских причин, почему компилятор VB вводит здесь анонимный тип - но это то, что он делает.

Я рекомендую всегда переводить синтаксис запроса C # LINQ (from a in list select a.Value) в цепочку методов (list.Select(a => a.Value)).Таким образом, компилятор VB не может вмешиваться.Вынужден использовать точную цепочку методов.

Однако ваш перевод исходного запроса неверен.

var q = from r in validationResults
        from m in r.MemberNames
        group r by m into g
        select g;

фактически переведен в

var q = validationResults.SelectMany(r => r.MemberNames, (r, m) => new { r, m })
                         .GroupBy(t => t.m, t => t.r);

который в VB становится:

Dim q = validationResults.SelectMany(Function(r) r.MemberNames,
                                     Function(r, m) New With { Key .r = r, Key .m = m }) _
                         .GroupBy(Function(t) t.m, Function(t) t.r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...