Попробовал VB.NET. Лучше Python. Оперативки меньше потребляется, многословность не напрягает, Visual Studio очень помогает делая подсказки, конструкции вроде Double.TryParse(cPrice, Globalization.NumberStyles.Currency, Globalization.CultureInfo.CreateSpecificCulture("uk-UA"), currentPrice) добавляют уверенности. Но писать на .NET это грех и подвисающий переписанный с использованием .NET Daemon tools с неотзывчивым GUI последней версии что я пробовал тому доказательство.

Внезапно обнаружил, что в C# нельзя декларативно объявлять xml‐литералы. На vb.net можно так:
Dim contact2 =
<contact>
<name>Patrick Hines</name>
<%= From p In phoneNumbers2
Select <phone type=<%= p.Type %>><%= p.Number %></phone>
%>
</contact>
То есть, декларативно объявлять xml, узлы, атрибуты, xml‐комментарии со всякими Linq внутри, CDATA и импортировать xmlns‐пространства имён.
А вот в c# этого нет, там можно только склеивать строки my.jetscreenshot.com
Но есть запрос на добавление такой фичи в код github.com

Как найти максимум в двумерном массиве:

Dim objRandom As New Random
Dim IndexA As Integer = 3 ' Первое измерение
Dim IndexB As Integer = 4 ' Второе измерение
Dim intBound As Integer = 100 ' Диапазон значений

' Получение двумерного множества из случайных чисел в диапазоне [0, intBound)
Dim m = Enumerable.Range(1, IndexA).Select(Function(i) Enumerable.Range(1, IndexB).Select(Function(j) objRandom.Next(intBound)).ToArray).ToArray
' Распечатать множество
Console.WriteLine(String.Join(vbCrLf,  m.Select(Function(i) String.Join(vbTab, i.Select(Function(j) j.ToString).ToArray)).ToArray))
' Найти максимум
Dim intMax = m.Select(Function(i) i.Max).Max
Console.WriteLine(intMax)

Функциональщина. Выводит элементы из интервала [100; 200), цифровой корень которых является простым числом.
Dim lambda As Func(Of Integer, Integer, Boolean) = Function(x, i) If(x = 1, False, If(x = i, True, If((x Mod i) = 0, False, lambda(x, i + 1))))
Dim dq As Func(Of Integer, Integer) = Function(x) If(x < 10, x, dq(x Mod 10 + dq(x \ 10)))
Dim q = Enumerable.Range(100, 100).Where(Function(x As Integer) lambda(dq(x), 2))
Console.WriteLine(String.Join(vbCrlF, q.Select(Function(x) x.ToString).ToArray))

visual basic.net говно сраное!!
час потратил перепроверять, где же ошибка была, когда переписывал с няшного C# на грёбаный vb.net!!!
оказалось, что этот падла при делении int-ов автоматом конвертит результат в double!!! и дальше в формуле поехало как double