lambda in vb.net:根据第一个对象中对象列表的属性,选择列表中的某些对象

时间:2015-01-20 19:24:20

标签: c# vb.net lambda

这个问题的标题并不是很清楚,但我很难将其制定得更好。我将展示一个我想要做的事情的例子。

Function foo(id As Integer) As List(Of Version)

    Dim listOfVersions as List(Of Version) = New List(Of Version)

    For each version In MasterListOfVersions
        For each object In version.ListOfObjects
            If object.idObject = id Then listOfVersions.Add(version)
        Next
    Next

    Return listOfVersions

End Function

这有效,但我试图将其转换为lambda表达式。到目前为止,我有这个:

Return MasterListOfVersions.Select(Function(version) version.ListOfObjects.Where( _
                                   Function(object) object.idObject = id)).ToList()

但它不是很正确......我收到以下错误消息:

List(Of IEnumerable(Of Object)) cannot be converted to List(Of Version)

我觉得我非常接近答案,但我已经看了一会儿,似乎我被卡住了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

基本上,您根本不需要致电Select - 您只执行过滤操作,这是Where为您提供的。您并未尝试转换列表。所以只需使用:

Return MasterListOfVersions.Where_
    (Function(version) version.ListOfObjects.Any_
        (Function object) object.id = id)).ToList()

换句话说,返回该版本中任何对象具有指定ID的所有版本。请注意,与原始代码不同,这只会添加MasterListOfVersions的每个元素一次,即使其ListOfObjects具有匹配ID的多个条目。我怀疑这是你想要的,说实话。

请注意,在原始代码中,您在一个地方使用object.idObject,而在另一个地方使用object.id。不明显哪个是正确的。

答案 1 :(得分:0)

您可能需要使用.SelectMany从子列表中进行选择。

我在这里有一篇博文: http://blogs.msmvps.com/deborahk/finding-in-a-child-list/

以下是该帖子的一个例子:

Dim foundCustomers = custList. 
    SelectMany(Function(cust) cust.ContactList. 
        Where(Function(cn) cn.LastName.StartsWith("B")), 
                Function(cust, cn) cust)