为什么VB.NET Linq Lambda以一种方式工作,而不是以另一种方式工作

为什么VB.NET Linq Lambda以一种方式工作,而不是以另一种方式工作,vb.net,linq,lambda,Vb.net,Linq,Lambda,我正在学习MVC3,同时从C#过渡到VB.NET(我知道这很有趣)。我正在运行MvcMusicStore示例以学习MVC3。所有的样本都是C语言的,所以我把它们转换成VB。我遇到了一段无法直接转换的代码,必须稍加修改才能使其正常工作 我不知道为什么一种方法行得通,另一种不行 这不起作用: Dim albums = New List(Of Album)() From { _ New Album() With { _ .Title = "A Copland Celebration,

我正在学习MVC3,同时从C#过渡到VB.NET(我知道这很有趣)。我正在运行MvcMusicStore示例以学习MVC3。所有的样本都是C语言的,所以我把它们转换成VB。我遇到了一段无法直接转换的代码,必须稍加修改才能使其正常工作

我不知道为什么一种方法行得通,另一种不行

这不起作用:

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));
新列表
{
新专辑{Title=“A Copland Celebration,Vol.I”,流派=流派.单曲(g=>g.Name==“Classic”),价格=8.99M,艺术家=艺术家.单曲(A=>A.Name==“Aaron Copland&伦敦交响乐团”),AlbumArtUrl=“/Content/Images/placeholder.gif”,
…[更多实例]
}.ForEach(a=>context.Albums.Add(a));

ForEach()方法的返回类型为
void
,因此不返回任何内容,因此无法将调用结果分配给变量。

ForEach()方法方法的返回类型为
void
,因此不返回任何内容,因此您无法将调用的结果分配给变量。

非常确定您的问题在这里:

Dim albums =

您正试图将ForEach操作的结果分配给变量
albums
ForEach
不返回任何内容,因此您在分配到
相册时失败了

很确定您的问题在这里:

Dim albums =

您正试图将ForEach操作的结果分配给变量
albums
ForEach
不返回任何内容,因此分配到
albums

的操作失败。在第一个示例中,您试图将albums分配给ForEach()的结果,这是最后一次方法调用。我第一次使用LINQ时也犯了同样的错误。大多数LINQ方法返回IQueryable对象,这样您就可以将一个方法链接到另一个方法,并将结果传递给下一个方法。最后一个调用的方法是ForEach()。最后一种方法的结果是将分配给相册的内容。因为ForEach()返回void,所以不能将其赋给变量,但这在C#等价物中有效。这只是我的一个误解吗?关于VB和C之间的区别?发布C等价物的代码。这两种语言都不行。用C代码更新了原始问题。编译器没有抱怨。当然它没有。。。您只是在调用一个方法,而不是将该方法的结果赋给一个变量!!!将“var albums=”放在您的C代码前面。。。这是与VB.NET示例不起作用的C#等价物。在第一个示例中,您试图将相册分配给ForEach()的结果,这是您的最后一个方法调用。我第一次使用LINQ时也犯了同样的错误。大多数LINQ方法返回IQueryable对象,这样您就可以将一个方法链接到另一个方法,并将结果传递给下一个方法。最后一个调用的方法是ForEach()。最后一种方法的结果是将分配给相册的内容。因为ForEach()返回void,所以不能将其赋给变量,但这在C#等价物中有效。这只是我的一个误解吗?关于VB和C之间的区别?发布C等价物的代码。这两种语言都不行。用C代码更新了原始问题。编译器没有抱怨。当然它没有。。。您只是在调用一个方法,而不是将该方法的结果赋给一个变量!!!将“var albums=”放在您的C代码前面。。。这是你的VB.NET示例的C#等价物,它不起作用。
ForEach
不是LINQ!!!它是
列表上的一种方法
ForEach
不是LINQ!!!它是
列表上的一种方法