2010-09-28 36 views
2

我發現StackOverflow上這個例子:Lambda和VB.NET

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) 這件事情讓我發瘋了。

有沒有人可以幫助我?

阿爾貝託

回答

4

你應該總是張貼究竟是不是工作


在你的情況,你想Update列表元素,其作品雖然傳遞應該爲每一個元素上運行的Action(Of T)

這樣一個行動,即剛剛運行,執行一些副作用,但返回沒有值由一個VB結構描述:A Sub

因此你想寫的是

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

這是有效的VB2010,但根本沒有在2008年的版本。 C#在那裏沒有問題,但是在你的VB代碼中,你想通過一個Function,它必須產生一個值,而不僅僅是執行一個賦值。 Func(Of ...)將是該表達式的適當類型。

那該怎麼辦? 你不能只表達你想要的版本的語法。但可能你不應該 - 在不修改舊版本的情況下建立一個新的集合。只要你處理價值類型/屬性,上述批准就根本不起作用,因爲實際上修改了Where返回的臨時集合。 Linq不是修改語言,而是查詢系統。

無論如何:只要使用一個簡單的循環。 Dario,

+0

謝謝你的幫助。我解釋了我的問題:「如果我嘗試更新我的收藏夾,則不起作用」。無論如何,我已經發現我可以做這樣的事情:.Update(AddressOf UpdateIsHip)UpdateIsHip是我的Function(或Sub),它完全符合我的預期。 – LeftyX 2010-09-28 19:56:33