Метод Linq для преобразования нулей в пустой IEnumerable <T>? - PullRequest
9 голосов
/ 24 мая 2011

Я имею дело с некоторыми массивами, которые мне возвращаются из стороннего API. Иногда они возвращаются как null. Я могу справиться со всем элегантно с помощью LINQ, за исключением нулевого случая. Я придумал что-то вроде этого:

IEnumerable<Thing> procs = APICall(foo, bar);
var result = from proc in procs ?? Enumerable.Empty<Thing>()
    where proc != null
    select Transform(proc);

Использование оператора слияния здесь немного раздражает. Я что-то упускаю из LINQ, который обрабатывает это?

Ответы [ 4 ]

12 голосов
/ 24 мая 2011

Это фактически то же решение, что и у вас, но я использую метод расширения.

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

Так что в итоге мы получим:

IEnumerable<Thing> procs = APICall(foo, bar);
var result = from proc in procs.EmptyIfNull()
             where proc != null
             select Transform(proc);
2 голосов
/ 24 мая 2011

Вы можете просто написать следующее:

IEnumerable<Thing> procs = APICall(foo, bar) ?? Enumerable.Empty<Thing>();

var result = from proc in procs
    where proc != null
    select Transform(proc);

Таким образом вы перемещаете коалесцирование за пределы выражения linq, что делает код более плотным.

Вы также можете просто полностью пропустить выражение linq, выполнив условную проверку ненулевого значения.

1 голос
/ 24 мая 2011

почему бы не использовать что-то более эффективное, например:

IEnumerable<Thing> procs = APICall(foo, bar);
IEnumerable<Transform> result = null;
if(procs != null)
    result = from proc in procs ?? Enumerable.Empty<Thing>()
         where proc != null
         select Transform(proc);
0 голосов
/ 24 мая 2011

Linq ожидает что-то неисчислимое, даже если оно пустое. Возможно, вы можете попытаться переместить коалесцирование после вызова API?

...