Lambda与VB.NET
我在StackOverflow上发现了以下示例: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
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),它完全符合我的预期。