2011-12-07 93 views
1

我正在學習MVC3並同時從C#轉換到VB.NET(我知道這很有趣)。我正在通過MvcMusicStore示例學習MVC3。所有的樣本都在C#中,所以我將它們轉換爲VB。我偶然發現了一段代碼,我無法直接轉換,只能稍作修改才能使其正常工作。爲什麼VB.NET Linq Lambda只能用一種方式工作,而不能用另一種方式

我不知道爲什麼一種方式有效,另一種不行。

這不起作用:

Dim albums = New List(Of Album)() From { _ 
    New Album() With { _ 
    .Title = "A Copland Celebration, Vol. I", _ 
    .Genre = genres.[Single](Function(g) g.Name = "Classical"), _ 
    .Price = 8.99D, _ 
    .Artist = artists.[Single](Function(a) a.Name = "Aaron Copland & London Symphony Orchestra"), _ 
    .AlbumArtUrl = "/Content/Images/placeholder.gif" _ 
    }, _ 
... [MORE INSTANCES] 
}.ForEach(Sub(a) context.Albums.Add(a)) 

然而,這沒有問題:

Dim albums = New List(Of Album)() From { _ 
    New Album() With { _ 
    .Title = "A Copland Celebration, Vol. I", _ 
    .Genre = genres.[Single](Function(g) g.Name = "Classical"), _ 
    .Price = 8.99D, _ 
    .Artist = artists.[Single](Function(a) a.Name = "Aaron Copland & London Symphony Orchestra"), _ 
    .AlbumArtUrl = "/Content/Images/placeholder.gif" _ 
    }, _ 
    ... [MORE INSTANCES] 
} 

albums.ForEach(Sub(a) context.Albums.Add(a)) 

兩者的區別在於,首先應用foreach所創造,而集合第二次將ForEach作爲單獨的呼叫應用。

爲什麼這會有所作爲?

編輯:添加原始的C#代碼

編譯器不會抱怨這裏。

new List<Album> 
{ 
    new Album { Title = "A Copland Celebration, Vol. I", Genre = genres.Single(g => g.Name == "Classical"), Price = 8.99M, Artist = artists.Single(a => a.Name == "Aaron Copland & London Symphony Orchestra"), AlbumArtUrl = "/Content/Images/placeholder.gif" }, 
    ... [MORE INSTANCES] 
}.ForEach(a => context.Albums.Add(a)); 
+0

'ForEach'不是LINQ !!!這是'List ' – cadrell0

回答

2

很肯定你的問題是在這裏:

Dim albums = 

您正試圖給ForEach操作的結果賦給變量albumsForEach不會返回任何內容,因此您無法將作業分配給albums

2

在foreach()方法的返回類型爲void,因此這樣你就不能分配呼叫到一個變量的結果,不返回任何東西。

+0

的一種方法。這裏沒有任務。除非我錯過了一些東西...... –

+0

在你的第一個例子中,你正試圖將專輯分配給ForEach()的結果,這是你最後的方法調用。當我第一次開始使用LINQ時,我犯了同樣的錯誤。大多數LINQ方法返回IQueryable對象,以便可以將一個方法鏈接到另一個方法並將結果傳遞給下一個方法。你調用的最後一個方法是ForEach()。最後一種方法的結果是分配給專輯的內容。由於ForEach()返回void,所以不能將其分配給一個變量。 –

+0

然而,這在C#等價物中起作用。這僅僅是我對VB和C#之間的區別的誤解嗎? –

相關問題