лямбда в vb.net: выбор определенных объектов из списка на основе атрибута списка объектов в первом объекте

1

Заголовок вопроса не очень понятен, но мне было трудно сформулировать его лучше. Я покажу пример того, что я пытаюсь сделать.

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)

Я чувствую, что я довольно близко к ответу, но я искал какое-то время, и кажется, что я застрял. Любая помощь будет оценена по достоинству.

  • 2
    «это не совсем правильно» не дает нам много информации. Это компилируется? Если нет, то в чем ошибка? Если это так, что он делает не так?
  • 0
    Вы правы, Джон, вот сообщение об ошибке: Список (Of System.Collections.Generic.IEnumerable (Of Object)) не может быть преобразован в List (Of Version)
Показать ещё 2 комментария
Теги:
lambda

2 ответа

2
Лучший ответ

В основном вам не нужно вызывать Select на всех - вы только выполнение операции фильтрации, что и Where дает вам. Вы не пытаетесь преобразовать список. Поэтому просто используйте:

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

Другими словами, верните все версии, где любой из объектов в этой версии имеет указанный ID. Обратите внимание, что в отличие от вашего исходного кода это добавит только каждый элемент MasterListOfVersions один раз, даже если его ListOfObjects имеет несколько записей с соответствующим идентификатором. Честно говоря, я подозреваю, что это то, чего вы хотите.

Обратите внимание, что в исходном коде вы используете object.idObject в одном месте, а object.id в другом. Это не очевидно, что правильно.

  • 0
    У версии нет идентификатора, который я ищу. Версия имеет список объектов, который имеет атрибут id. Это то, что я фильтрую.
  • 0
    @Felix Итак, измените его на version.Lists.Any(Function(obj) obj.id = id) или любой другой синтаксис VB для этого.
Показать ещё 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)
  • 1
    Но тогда вы не можете вернуть исходный (родительский) элемент. То, что вы действительно хотите, это .Where(ver => ver.ListOfObjects.Any(o => o.Id == id)) .
  • 0
    На самом деле, может быть, это не то, что вы хотите; Я не могу сказать, что спрашивает ОП. Если вы просто хотите дочерние объекты, тогда это нормально.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню