代码之家  ›  专栏  ›  技术社区  ›  LeftyX

Lambda和VB.NET版

  •  2
  • LeftyX  · 技术社区  · 15 年前

    我在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);
    }
    

    在C#一切正常。 代码如下:

    <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
    

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

    我正在使用VS2008(3.5) 这东西快把我逼疯了。

    有人能帮我吗?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Dario    15 年前

    你应该经常发帖 到底是什么不起作用 .


    Update 列表元素,通过传递 Action(Of T)

    这样一个动作,即刚刚运行,执行一些副作用,但不返回任何值,只由一个VB构造描述:A 附属的 .

    所以你想写的是

    .Update(Sub(p) p.isHip = true)
    

    Function Func(Of ...) 是那个表达式的合适类型。

    那该怎么办呢? 你不能仅仅用你的版本的语法来表达你想要的。但也许你不应该在不修改旧集合的情况下构建一个新集合。一旦处理了值类型/属性,上述方法就根本不起作用,因为实际上是 Where