这个问题的标题并不是很清楚,但我很难将其制定得更好。我将展示一个我想要做的事情的例子。
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)
我觉得我非常接近答案,但我已经看了一会儿,似乎我被卡住了。任何帮助将不胜感激。
答案 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)