Проверка нуля перед объединением нескольких коллекций

У меня есть следующий код, каждая из коллекций наследуется от MyCollection

var result = MyCollectionA.Concat(MyCollectionB.Concat(MyCollectionC
             .Concat<MyCollection>(MyCollectionD)));

как лучше всего проверить, не является ли каждый из них нулевым, прежде чем выполнять concat? Я знаю, что могу написать большой блок if else, но мне интересно, есть ли лучший подход

Безусловно, лучший подход - сохранить инвариант, что никакая коллекция никогда не может быть null, и любое место, которое может попытаться создать null, вынуждено вместо этого создавать пустую коллекцию - перед любая операция с ней. Это экономит код, как вы не поверите.

Jeroen Mostert 10.08.2018 17:11

Используйте ссылочные типы, допускающие значение NULL!

Enigmativity 12.08.2018 23:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете объявить вспомогательный метод EmptyIfNull и проверить, является ли там коллекция нулевой, если да, верните Enumerable.Empty<MyCollection>. Тогда код будет выглядеть следующим образом:

MyCollectionA.EmptyIfNull()
             .Concat(MyCollectionB.EmptyIfNull())
             .Concat(MyCollectionC.EmptyIfNull());

Конечно, вы можете предпочесть более короткое имя, если хотите.

EmptyIfNull можно было бы объявить так:

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source) 
{
    return source ?? Enumerable.Empty<T>(); 
}

Вы можете использовать оператор объединения с нулем и Enumerable.Empty:

var result = MyCollectionA.Concat(MyCollectionB ?? Enumerable.Empty<MyClass>())
                          .Concat(MyCollectionB ?? Enumerable.Empty<MyClass>())
                          .Concat(MyCollectionC ?? Enumerable.Empty<MyClass>())
                          .Concat(MyCollectionD ?? Enumerable.Empty<MyClass>())

Нет необходимости возиться с методами расширения. Самый простой и короткий способ - это:

var result =
    new [] { MyCollectionA, MyCollectionB, MyCollectionC, MyCollectionD }
        .Where(x => x != null)
        .Concat();

Получите сообщение об ошибке - не найден лучший тип для неявно типизированного массива - коллекции имеют тип ReadOnlyCollection

Ctrl_Alt_Defeat 13.08.2018 11:13

@Ctrl_Alt_Defeat - это та информация, которую вы бы задали в вопросе. Не могли бы вы отредактировать свой вопрос, указав типы коллекций и связанные с ними классы?

Enigmativity 13.08.2018 13:42

Другие вопросы по теме