Подтвердить что ты не робот

Использование LINQ ForEach с анонимными методами в VB.NET

Я пытаюсь заменить классический цикл 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 ???

Как я могу правильно это сделать с помощью анонимных методов (т.е. без объявления новой функции)?

4b9b3361

Ответ 1

Попробуйте следующее:

singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s))))

Здесь вам нужен Sub, потому что тело вашего цикла For Each не возвращает значение.

Ответ 2

Скорее, используя метод расширения .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() до конца вышеприведенных примеров кода.

Ответ 3

Вы должны использовать функцию, если вы ожидаете, что выражение 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))))