Lambda与VB.NET

Lambda与VB.NET,vb.net,lambda,action,Vb.net,Lambda,Action,我在StackOverflow上发现了以下示例: var people = new List<Person> { new Person{Name="aaa", Salary=15000, isHip=false} ,new Person{Name="aaa", Salary=15000, isHip=false} ,new Person{Name="bbb", Salary=20000, isHip=false} ,new Person{Name="c

我在StackOverflow上发现了以下示例:

var people = new List<Person> {
    new Person{Name="aaa", Salary=15000, isHip=false}
    ,new Person{Name="aaa", Salary=15000, isHip=false}
    ,new Person{Name="bbb", Salary=20000, isHip=false}
    ,new Person{Name="ccc", Salary=25000, isHip=false}
    ,new Person{Name="ddd", Salary=30000, isHip=false}
    ,new Person{Name="eee", Salary=35000, isHip=false}
};


people.Where(p => p.Salary < 25000).Update(p => p.isHip = true);

foreach (var p in people)
{
Console.WriteLine("{0} - {1}", p.Name, p.isHip);
}

public static void Update<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
    action(item);
}
var people=新列表{
新人{Name=“aaa”,工资=15000,isHip=false}
,新人{Name=“aaa”,工资=15000,isHip=false}
,新人{Name=“bbb”,工资=20000,isHip=false}
,新人{Name=“ccc”,工资=25000,isHip=false}
,新人{Name=“ddd”,工资=30000,isHip=false}
,新人{Name=“eee”,工资=35000,isHip=false}
};
people.Where(p=>p.Salary<25000)。Update(p=>p.isHip=true);
foreach(人的var p)
{
Console.WriteLine(“{0}-{1}”,p.Name,p.isHip);
}
公共静态无效更新(此IEnumerable源,操作)
{
foreach(源中的var项)
行动(项目);
}
在C#中,一切正常。 我试图在VB.NET中转换它。 代码如下:

<System.Runtime.CompilerServices.Extension()> _
Public Sub Update(Of T)(ByVal source As IEnumerable(Of T), ByVal action As Action(Of T))
    For Each item In source
        action(item)
    Next item
End Sub
_
公共子更新(T的)(ByVal源作为IEnumerable(T的),ByVal操作作为action(T的))
对于源中的每个项目
行动(项目)
下一项
端接头
但是,如果我尝试更新我的收藏,则无法实现:

people.Where(Function(p) p.Salary < 25000).Update(Function(p) p.isHip = true)
people.Where(函数(p)p.薪水<25000)。更新(函数(p)p.isHip=true)
我正在使用VS2008(3.5) 这件事快把我逼疯了

有人能帮我吗

阿尔贝托

你应该经常发布不起作用的东西


在您的例子中,您希望
更新
列表元素,它通过传递应该为每个元素运行的
操作(Of T)
来工作

这样一个刚刚运行的操作执行一些副作用,但不返回任何值,这完全是由一个VB构造描述的:ASub

因此,你想写的是

.Update(Sub(p) p.isHip = true)
这是有效的VB2010,但在2008版本中根本不起作用。C#没有问题,但在VB代码中,您希望传递一个
函数
,该函数必须生成一个值,而不仅仅是执行赋值
Func(Of…)
将是该表达式的适当类型

那怎么办呢? 你不能仅仅用你版本的语法来表达你想要的。但是你可能不应该在不修改旧集合的情况下构建新集合。一旦您处理了值类型/属性,上述方法就根本不起作用,因为实际上,
返回的临时集合被修改了。Linq不是修改语言,而是一个查询系统


无论如何:只需使用普通循环。

谢谢你的帮助,达里奥。我解释了我的问题是什么:“如果我试图更新我的收藏,事情就不会发生。”。无论如何,我发现我可以这样做:.Update(AddressOf updateship)其中updateship是我的函数(或Sub),它完全符合我的预期。