Когда вы перебираете карту, она превращается в список ключевых слов (т. Е. Вы используете кортеж):
Enum.each %{a: 1, b: 2, c: 3}, fn {key, value} ->
IO.puts "#{key} : #{value}"
end
В вашем случае вам нужно найти совпадение в части key
вы кортеж:
val_map = %{"pri" => %{"tit" => "name1"}}
fp = fn ({"pri", value}) -> value; {other_key, value} -> value end
Где во второй части вы можете сделать что-то еще со значением: преобразовать, не возвращать его и т. д.
В этом случае он вернет массив карт (значений) из вашей исходной карты:
Enum.each(val_map, fp)
# [%{"tit" => "name1"}]
Чтобы ответить на ваш вопрос о лямбда-выражении, это слишком сложно для включения в лямбда-выражение, поскольку VB не поддерживает многострочные лямбда-выражения.
Для не-LINQ решение:
В качестве средства сравнения вам нужен именованный метод:
Private Function Comparer(ByVal x As Product, ByVal y As Product) As Integer
Dim result As Integer = x.Popular.CompareTo(y.Popular)
If result = 0 Then
result = x.Clicked.CompareTo(y.Clicked)
If result = 0 Then
result = x.Name.CompareTo(y.Name)
End If
End If
Return result
End Function
Использование:
theList.Sort(AddressOf Comparer)
Извините, но знаете ли вы какой-нибудь C #?
products.OrderBy(p => p.Popular).
ThenByDescending(p => p.Clicked).
ThenBy(p => p.Name);
Сможете ли вы получить из этого то, что вам нужно?
РЕДАКТИРОВАТЬ Только что понял, что это вопрос VB. Вот версия решения VB.Net
Dim list = GetSomeList()
Dim sorted = list. _
OrderBy(Function(x) x.Popular). _
ThenBy(Function(x) x.Clicked). _
ThenBy(Function(x) x.Name)
C #. Попробуйте выполнить следующее
var list = GetSomeList();
var sorted = list.OrderBy(x => x.Popular).ThenBy(x => x.Clicked).ThenBy(x => x.Name);