Как сделать дефолт (TSource) - PullRequest
2 голосов
/ 21 июня 2011

В Linq Когда я вызываю SingleOrDefault или FirstOrDefault, как я могу вернуть что-то отличное от нуля для определенного объекта, например.

        List<CrazyControls> cc = CrazyControlRepository.All();
        cc.SingleOrDefault(p => p.Id == id).Render();

Как заставить мои CrazyControls возвращать экземпляр по умолчанию, который реализует базовый рендер) метод?

Ответы [ 2 ]

7 голосов
/ 21 июня 2011

С DefaultIfEmpty(defaultValue). Это гарантирует, что если коллекция пуста, она будет заполнена экземпляром по умолчанию типа.

Так что вы можете сделать:

var defaultValue = new CrazyControl(...);

List<CrazyControls> cc = CrazyControlRepository.All();
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render();

Выражение запроса необходимо немного изменить. Новый работает так:

  1. Фильтрация коллекции в соответствии с существующими критериями. Это оставит либо один, либо ни одного элемента в отфильтрованной последовательности.
  2. Используйте DefaultIfEmpty, чтобы убедиться, что последовательность содержит ровно один элемент (если он уже был, DefaultIfEmpty ничего не сделает).
  3. Используйте First, чтобы получить один предмет. Причина, по которой я не использовал Single вместо первой, заключается в том, что если предикат будет другим (или он изменится в будущем) и будет принимать несколько элементов, Single выдаст.
3 голосов
/ 21 июня 2011

Вам нужно определить это «что-то», что вы хотите вернуть, если нет элементов:

(cc.SingleOrDefault(p => p.Id == id) ?? new CrazyControls()).Render();

Другими словами, вам нужно определить default value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...