Заголовок вопроса не очень понятен, но мне было трудно сформулировать его лучше. Я покажу пример того, что я пытаюсь сделать.
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
Это работает, но я пытаюсь превратить это в лямбда-выражение. До сих пор у меня это было:
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()
Другими словами, верните все версии, где любой из объектов в этой версии имеет указанный ID. Обратите внимание, что в отличие от вашего исходного кода это добавит только каждый элемент MasterListOfVersions
один раз, даже если его ListOfObjects
имеет несколько записей с соответствующим идентификатором. Честно говоря, я подозреваю, что это то, чего вы хотите.
Обратите внимание, что в исходном коде вы используете object.idObject
в одном месте, а object.id
в другом. Это не очевидно, что правильно.
version.Lists.Any(Function(obj) obj.id = id)
или любой другой синтаксис VB для этого.
Возможно, вам придется использовать.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)
.Where(ver => ver.ListOfObjects.Any(o => o.Id == id))
.