Требуется ли нулевая проверка для объекта IEnumerable? - PullRequest
10 голосов
/ 05 мая 2011
var selectedRows = from drow in ugTable.Rows
                         .Cast<Infragistics.Win.UltraWinGrid.UltraGridRow>()
                         .Where(drow => drow != null && drow.Selected) 
                   select drow;

if(selectedRows.Count()==1){//do something with selected rows}

Из вышеприведенного оператора нужно ли проверить значение Null для переменной selectedRows ? selectedRows является переменной IEnumerable.

Ответы [ 5 ]

20 голосов
/ 05 мая 2011

Вам не нужно проверять, является ли selectedRows null.Возвращенное значение IEnumerable<> может быть пустым, но оно никогда не будет null.

В качестве отступления, я бы посоветовал вам упростить код, написав:

var selectedRows
    = ugTable.Rows.Cast<Infragistics.Win.UltraWinGrid.UltraGridRow>()
                  .Where(drow => drow != null && drow.Selected);

короче и эквивалент.

6 голосов
/ 05 мая 2011

Запрос LINQ вернет пустой список (0 элементов), если совпадений в строке where нет.

Итак, нет необходимости проверять null.

2 голосов
/ 02 марта 2014

В вашем примере вы будете в порядке, используя метод расширения.Но если бы вы реализовали свой собственный метод, который возвращал IEnumerable, ответ зависит от того, как вы возвращаете свой результат.

Следующий метод возвращает пустое перечисляемое значение:

IEnumerable<object> Correct()
{
    yield break;
}

Следующий методпросто возвращает null:

IEnumerable<object> Incorrect()
{
    return null;
}

Вызов этих методов даст следующие результаты:

Correct().Any(); // returns false
Incorrect().Any(); // throws ArgumentNullException

Так что будьте осторожны, когда вы возвращаете IEnumerable.Попробуйте использовать ключевое слово yield и следуйте правильному шаблону.

2 голосов
/ 05 мая 2011

Мое первоначальное чувство - нет, нет, но это определенно не может повредить.

У меня, как мне кажется, Фил Хаак, есть полезный метод расширения, который проверяет, является ли IEnumerableпусто или пусто ...

    /// <summary>
    /// Determines whether the collection is either null or empty.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source">The source collection.</param>
    /// <returns>
    ///     <c>true</c> if the collection is null or empty; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
    {
        return source == null || !source.Any();
    }

.Any() гораздо эффективнее проверять, если не пусто, чем .Count()

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

Linq не будет возвращать NULL. Если вы хотите проверить, есть ли какие-то данные, вы можете воспользоваться Any ()

var selectedRows = from drow in ugTable.Rows
                         .Cast<Infragistics.Win.UltraWinGrid.UltraGridRow>()
                         .Where(drow => drow != null && drow.Selected) 
                   select drow;
if(selectedRows .Any())
{
//your code
}
...