Ответ 1
Попробуйте следующее:
singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s))))
Здесь вам нужен Sub
, потому что тело вашего цикла For Each
не возвращает значение.
Я пытаюсь заменить классический цикл For Each
на расширение LINQ ForEach
в VB.NET...
Dim singles As New List(Of Single)(someSingleList)
Dim integers As New List(Of Integer)
For Each singleValue In singles
integers.Add(CInt(Math.Round(singleValue)))
Next singleValue
Может быть, что-то вроде этого?
singles.ForEach(Function(s As [Single]) Do ???
Как я могу правильно это сделать с помощью анонимных методов (т.е. без объявления новой функции)?
Попробуйте следующее:
singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s))))
Здесь вам нужен Sub
, потому что тело вашего цикла For Each
не возвращает значение.
Скорее, используя метод расширения .ForEach
, вы можете просто напрямую произвести результаты следующим образом:
Dim integers = singles.Select(Function(x) Math.Round(x)).Cast(Of Integer)()
Или без использования .Cast
, например:
Dim integers = singles.Select(Function(x) CInt(Math.Round(x)))
Это избавляет вас от необходимости предписывать List(Of Integer)
, и я также думаю, что яснее, что вы просто применяете преобразование и создаете результат (что ясно из назначения).
Примечание: это создало IEnumerable(Of Integer)
, которое можно использовать в большинстве мест, где вы использовали бы List(Of Integer)
... но вы не можете добавить к нему. Если вы хотите List
, просто нажмите на .ToList()
до конца вышеприведенных примеров кода.
Вы должны использовать функцию, если вы ожидаете, что выражение inline вернет значение. Например:
Dim myProduct = repository.Products.First(Function(p) p.Id = 1)
Это будет использовать выражение Function, потому что это то, что оценивается как логическое (p.Id = 1).
Вам нужно использовать Sub, потому что из выражения ничего не возвращается:
singles.ForEach(Sub(s) integers.Add(CInt(Math.Round(s))))