vb.net 中的 lambda:Select 列表的某些 object,基于第一个 object 中 object 列表的属性

lambda in vb.net: Select certain objects of a list, based on an attribute of a list of object within the first object

问题的标题不是很清楚,但我很难把它表述得更好。我将展示我正在尝试做的事情的示例。

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)

我觉得我已经很接近答案了,但是我已经找了一段时间了,好像卡住了。任何帮助将不胜感激。

基本上你根本不需要调用 Select - 你只需要执行 过滤 操作,这就是 Where 给你的.您不是要转换列表。所以只需使用:

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

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

请注意,在您的原始代码中,您在一处使用了 object.idObject,而在另一处使用了 object.id。哪个正确还不清楚。

您可能需要使用 .SelectMany 来 select 来自子列表。

我有一篇关于它的博客post: http://blogs.msmvps.com/deborahk/finding-in-a-child-list/

这是一个例子 post:

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