WedX - журнал о программировании и компьютерных науках

Используйте LINQ для выбора одного из вложенных коллекций.

У меня есть два класса — MyBaseClass и BaseClassContainer — которые объявлены следующим образом:

public class MyBaseClass
{
    private Guid id;
    public Guid ID
    {
        if (id == Guid.Empty)
        {
            id = Guid.NewGuid();
        }
        return id;
    }
    //...Other Properties omitted for brevity
}

а также

public class BaseClassContainer : INotifyPropertyChanged
{
    private ObservableCollection<MyBaseClass> baseClasses;
    public ObservableCollection<MyBaseClass> BaseClasses
    {
    //...Omitted for brevity...
    }
}

Затем в моем коде есть ObservableCollection типа BaseClassContainer (BaseClassContainerCollection). Я пытаюсь понять, как я могу использовать LINQ для выбора одного BaseClassContainer из ObservableCollection, где один из его MyBaseClass.ID соответствует определенному Guid. Причина, по которой я использую метод Single(), заключается в том, что я знаю, что все они будут уникальными.

Я пробовал следующее, но это не работает:

var result = BaseClassContainerCollection.Single(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid));

Я получаю сообщение об ошибке: Невозможно неявно преобразовать тип MyBaseClass в bool. Что мне не хватает?


Ответы:


1

Давайте разберем ваш запрос:

BaseClassContainerCollection.Single(yourPredicate);

Single, как он используется здесь, в основном говорит: «фильтровать BaseClassContainerCollection по этому предикату» («фильтрующая» функция, которая оценивается как истинная или ложная, чтобы включить ее в результаты). Вместо функции, которая возвращает true/false, вы говорите, что хотите, чтобы она оценивалась как MyBaseClass, что не имеет смысла. Ваш внутренний вызов Single имеет смысл, потому что x => x.Id == guid — это функция, которая возвращает true/false и фильтрует только те элементы, которые соответствуют критериям (затем заявляет, что вы знаете, что в результатах будет только один из них, иначе выдает исключение) .

То, что вы хотите сделать, это Select единственный результат MyBaseClass из внутреннего запроса, а затем вызвать Single для результата (без предиката), поскольку вы знаете, что в результате должен быть возвращен только один элемент. Я считаю, что вы ищете:

BaseClassContainerCollection.Select(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid)).Single();
27.06.2012
  • Думаю, это именно то, что я искал. Теперь мне просто нужно понять, почему он говорит мне, что последовательность не содержит совпадающих элементов. Я ставлю точку останова на эту конкретную строку и наблюдаю, как она находит MyBaseClass, где идентификатор соответствует конкретному Guid, но все равно говорит мне, что совпадений нет. Я думаю, что это может быть обязательным вопросом. Однако пока отметим это как ответ. 27.06.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]