У меня есть следующий код, каждая из коллекций наследуется от MyCollection
var result = MyCollectionA.Concat(MyCollectionB.Concat(MyCollectionC
.Concat<MyCollection>(MyCollectionD)));
как лучше всего проверить, не является ли каждый из них нулевым, прежде чем выполнять concat? Я знаю, что могу написать большой блок if else, но мне интересно, есть ли лучший подход
Используйте ссылочные типы, допускающие значение NULL!
Вы можете объявить вспомогательный метод 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 - это та информация, которую вы бы задали в вопросе. Не могли бы вы отредактировать свой вопрос, указав типы коллекций и связанные с ними классы?
Безусловно, лучший подход - сохранить инвариант, что никакая коллекция никогда не может быть
null
, и любое место, которое может попытаться создатьnull
, вынуждено вместо этого создавать пустую коллекцию - перед любая операция с ней. Это экономит код, как вы не поверите.