Действие (Of T) в Visual Basic в списке (Of T) .ForEach - PullRequest
7 голосов
/ 21 мая 2009

Я искал высоко и низко документацию о том, как использовать эту функцию. Хотя цикл, который я мог бы написать, был бы простым и не занимал время, я действительно хотел бы научиться использовать это.

По сути, у меня есть класс, скажем, Widget, с подпрограммой Save(), которая ничего не возвращает. Итак:

Dim w as New Widget()
w.Save()

в основном сохраняет виджет. Теперь допустим, у меня есть общая коллекция List(Of Widget) name widgetList(Of Widget), и я хочу запустить Save() для каждого элемента в этом списке. Он говорит, что я могу сделать

widgetList.ForEach([enter Action(Of T) here])

.... но как в F это работает ??? Там нет документации нигде на intrablags. Помощь будет высоко ценится.

Ответы [ 5 ]

13 голосов
/ 08 апреля 2010

ну, я действительно устарел ... :-) но в VB это:

widgetList.ForEach(Sub(w) w.Save())

или, более сложный:

widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save()))
11 голосов
/ 21 мая 2009

Если вы используете VB9 (VS2008), я не думаю вы сможете легко использовать анонимную функцию - насколько мне известно, анонимные функции в VB9 иметь , чтобы быть реальными функциями (т.е. они должны возвращать значение), тогда как Action<T> ничего не возвращает. Анонимные методы C # 2 и лямбда-выражения C # 3 являются более общими, поэтому вы увидите множество примеров, использующих List<T>.ForEach из C #, и очень немногие, использующих VB: (

Вы могли бы написать оболочку MakeAction, которая принимает a Function<T,TResult> и возвращает Action<T>, но я подозреваю, что другие ограничения анонимных функций VB9 сделают это непрактичным.

Хорошей новостью является то, что VB10 имеет гораздо больше поддержки анонимных функций . (C # 4 и VB10 приобретают функции друг друга - я полагаю, что отныне MS пытается добиться языкового паритета, в большей степени, чем раньше.)

До этого для использования List<T>.ForEach вам нужно написать соответствующий Sub и использовать AddressOf для создания делегата из него. Вот небольшой пример:

Imports System
Imports System.Collections.Generic

Public Class Test

    Shared Sub Main()
        Dim names as New List(Of String)
        names.Add("Jon")
        names.Add("Holly")
        names.ForEach(AddressOf PrintMe)

    End Sub

    Shared Sub PrintMe(ByVal text as String)
        Console.WriteLine(text)
    End Sub

End Class
1 голос
/ 15 августа 2011
new Action(Of T)(AddressOf Widget.Save) 

в порядке, если Widget получил открытую функцию с именем Save.

Все остальные комментарии ложны, когда я пытаюсь это сделать.

0 голосов
/ 21 мая 2009

Предполагая, что VB не поддерживает лямбда-выражения, вы можете создать экземпляр делегата Action (of T) в VB, используя этот синтаксис:

new Action(Of T)(AddressOf Widget.Save)
0 голосов
/ 21 мая 2009

Нижеследующее должно работать, хотя я не до скорости на VB.Net, поэтому вам, возможно, придется настроить соответственно.

widgetList.ForEach(w => w.Save())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...