C # - проверка на нулевые значения в IEnumerable <T>разных типов - PullRequest
0 голосов
/ 20 октября 2019

Как я могу проверить наличие нулевых значений на IEnumerable<T>, где T может быть либо ссылочным типом, либо Nullable<T> типом?

Я получаю параметр object в методе, который может быть IEnumerable<string>или IEnumerable<bool?> или IEnumerable<int?> или IEnumerable<Guid?> и т. д. (это также могут быть типы, не относящиеся к коллекции ... отсюда тип object). И мне нужно проверить наличие нулей.

Итак, я попробовал что-то вроде value is IEnumerable<object> objValue && objValue.Contains(null), но это работает только для ссылочных типов. Когда это Nullable<>, оно не работает из-за отсутствия ковариации типов значений.

Есть ли способ, которым я могу решить эту проблему, не прибегая к куче размышлений?

Ответы [ 3 ]

0 голосов
/ 20 октября 2019

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

public void DoSomethingWith(IEnumerable<string> values)
{
    var notNullValues = values.Where(value => value != null).ToArray();

    // Do something with not null values
}

public void DoSomethingWith(IEnumerable<Nullable<T>> values)
{
    var notEmptyValues = values.Where(value => value.HasValue).ToArray();

    // Do something with not null values
}
0 голосов
/ 20 октября 2019

Довольно простым способом является использование того факта, что интерфейс IEnumerable<T> наследует неуниверсальный интерфейс IEnumerable:

value is IEnumerable enumerable && enumerable.Cast<object>().Contains(null)

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

0 голосов
/ 20 октября 2019

Я бы хотел, чтобы ваш текущий метод обрабатывал только не-типы коллекций. Создайте новый метод, который принимает IEnumerable для обработки проверки коллекций.

Что касается проверки на нулевые значения, почему бы просто не сделать x == null или Object.Equals (x, null)?

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