Различия в синтаксисе LINQ между VB.Net и С#

Опять, просто из любопытства:

После того, как я запрограммировал несколько проектов в VB.Net, я, к своему удивлению, обнаружил, что существуют некоторые более тонкие различия между использованием С# и VB.NET LINQ. Например, если мы хотим группировать элементы по нескольким свойствам (столбцам), нам нужно явно создать новый анонимный тип:

var procs = from c in Process.GetProcesses() 
            group c by new {c.BasePriority, c.Id} into d 
            select d;

тогда как в VB.NET будет выполняться более простой синтаксис:

Dim b = From c In Process.GetProcesses()
        Group c By c.BasePriority, c.Id Into Group
        Select Group

Таким образом, здесь не нужно создавать тип с "новым".

Каковы другие отличия? Есть ли хорошее сравнение синтаксиса LINQ в С# и VB.NET?

Ответ 1

Есть некоторые отличия, о которых я знаю, в основном, что VB.NET LINQ имеет некоторые скрытые камни:

  • Не указано LINQ, но VB.NET поддерживает модификатор Key для анонимных типов. Это позволяет определить, какие свойства в анонимном типе используются при сравнении анонимных типов. Насколько я могу судить по С#; он использует все. Здесь VB.NET имеет фактическое преимущество.
  • VB.NET поддерживает операцию Skip как ключевое слово: Dim returnCustomers = From a In list Skip numToSkip Select a Вы можете сделать это на С#; но это должно быть через метод расширения, нет синтаксического сахара.
  • VB.NET LINQ также поддерживает Skip While: From a In list Skip While someCondition Select a Опять же, С# может это сделать; но только с помощью метода расширения.
  • и 4.5: То же, что и 2 и 3, за исключением Take и Take While
  • Ключевое слово Select является необязательным в VB.NET. Если вы хотите выбрать то, что является текущим; то это отлично работает: Dim shortWords = From l In list Where l.Length < 10 в С#; требуется часть выбора: var shortWords = from l in list where l.Length < 10 select l

Это дополнительные "функции" VB.NET LINQ, о которых я знаю.

Например; с С#:

var skip10 = (from c in customers select c).Skip(10);

И в VB.NET

Dim skip10 = From c In Customers Skip 10

Вы можете увидеть документацию по всем этим здесь: http://msdn.microsoft.com/en-us/library/ksh7h19t(v=VS.90).aspx