Лямбда и VB.NET - PullRequest
       5

Лямбда и VB.NET

2 голосов
/ 28 сентября 2010

Я нашел этот пример в 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 # все отлично работает. Я пытался преобразовать его в 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

Если я пытаюсь обновить свою коллекцию, вещи не работают, хотя:

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

Я использую VS2008 (3.5) Эта вещь сводит меня с ума.

Кто-нибудь может мне помочь?

Альберто

1 Ответ

4 голосов
/ 28 сентября 2010

Вы должны всегда публиковать что именно не работает .


В вашем случае вы хотите Update список элементов, который работает, хотя и передает Action(Of T), который должен быть запущен для каждого элемента.

Такое действие, которое только что выполнено, выполняет некоторые побочные эффекты, но не возвращает значения, описываемого ровно одной конструкцией VB: A Sub .

Таким образом, вы хотели бы написать:

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

, который действителен для VB2010, но просто не работает в версии 2008 года. В C # нет проблем, но в вашем VB-коде вы хотите передать Function, который должен производить значение, а не просто выполнять присваивание. Func(Of ...) будет подходящим типом этого выражения.

Так что же делать? Вы не можете просто выразить то, что вы хотите в синтаксисе вашей версии. Но, вероятно, вы не должны - создавать новую коллекцию без изменения старой. Как только вы разберетесь с типами / свойствами значений, приведенный выше подход не будет работать вообще, так как на самом деле временная коллекция, возвращаемая Where, изменяется. Linq - это не язык модификации, а система запросов.

В любом случае: просто используйте простую петлю.

...