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

У меня есть следующий код, каждая из коллекций наследуется от 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
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

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