Linq не группируется в VB.Net - PullRequest
       29

Linq не группируется в VB.Net

10 голосов
/ 26 октября 2011

В образовательных целях я пытался преобразовать следующее выражение Linq из книги "Linq in action" в VB.net

Оригинал C #

var list = 
  from book in SampleData.Books
  group book by new { book.Publisher.Name, book.Subject }
    into grouping
  select new {
    Publisher = grouping.Key.Publisher,
    Subject = grouping.Key.Subject,
    Book = grouping
  };

Моя попытка:

Dim list = _books.GroupBy(Function(book) New With {.Publisher = book.Publisher.Name,
                                                    book.Subject}).
                  Select(Function(grouping) New With {.Publisher = grouping.Key.Publisher,
                                                      .Subject = grouping.Key.Subject,
                                                      .Books = grouping})

For Each item In list
  Console.WriteLine("Publisher:" & item.Publisher & ", Subject:" & item.Subject)
  For Each Book In item.Books
    Console.WriteLine("  " & Book.Title)
  Next
Next

Это приводит к следующему выводу:

Publisher:FunBooks, Subject:Fun  
  Funny Stories  
Publisher:Joe Publishing, Subject:Work  
  LINQ rules  
Publisher:Joe Publishing, Subject:Work  
  C# on rails  
Publisher:Joe Publishing, Subject:Fun  
  All your base are belong to us  
Publisher:FunBooks, Subject:Fun  
  Bonjour mon Amour  

Я ожидал, что книги "Правила LINQ" и "C # на рельсах" сгруппированы так же, как и книги "Веселые истории" и "Bonjour mon Amour ", потому что у них один и тот же издатель и тема.Мой анонимный ключ состоит из нового объекта из двух простых строк.

Я уже пытался искать в SO, но другие ( или ) ответы не решают мою проблему.Даже некоторые переводчики кода, такие как telerik или carlosag , не помогут в этом случае.

Ответы [ 2 ]

7 голосов
/ 26 октября 2011

Это проблема:

GroupBy(Function(book) New With {.Publisher = book.Publisher.Name,
                                  book.Subject})

Это не эквивалентно версии C #, потому что, к сожалению, VB по умолчанию использует свойства mutable в анонимных типах, а изменяемые свойства не рассматриваются как часть хэш-кода или операций равенства. Вам нужно сделать оба свойства «Ключом»:

GroupBy(Function(book) New With {Key .Publisher = book.Publisher.Name,
                                 Key book.Subject})

Тогда все должно работать нормально. Вы можете прочитать больше об анонимных типах в VB на MSDN .

5 голосов
/ 26 октября 2011

Хотя я приветствую ваши усилия по переводу сэмплов, у нас фактически есть все сэмплы для LINQ в действии на C # и VB, доступные для загрузки с сайта Manning: http://www.manning.com/marguerie/. Кроме того, мы добавили сэмплы в Образцы LinqPad, чтобы можно было легко попробовать образцы и сохранить изменения. См. http://www.thinqlinq.com/Default/LINQ-In-Action-Samples-available-in-LINQPad.aspx для получения инструкций о том, как получить к нему доступ.

Похоже, вы работаете над примером 5.06b. Немного обновив наш перевод на VB:

Dim query = _
  From book In SampleData.Books _
  Group book.Title By book.Publisher, book.Subject Into grouping = Group _
  Select _
    Publisher = Publisher.Name, _
    Subject = Subject.Name, _
    Titles = grouping 

Если вы хотите использовать лямбда-синтаксис, вам нужно указать ключ в виде @johnskeet:

Dim list = SampleData.Books.GroupBy(Function(book) New With { 
                          Key .Publisher = book.Publisher.Name, 
                          Key .Subject = book.Subject}). 
               Select(Function(grouping) New With {
                  .Publisher = grouping.Key.Publisher, 
                  .Subject = grouping.Key.Subject, 
                  .Books = grouping}) 
...