IEnumerable对象需要进行空值检查吗?

13
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}

从上述语句中,我需要检查选定行的变量 selectedRows 是否为 Null 吗?
该变量是一个 IEnumerable 类型。

5个回答

25

您不需要检查selectedRows是否为null。返回的IEnumerable<>可能为空,但永远不会为null

此外,我建议您通过编写以下代码来简化您的代码:

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

哪个更短而且等效。


耶!在LINQ中,Lambda表达式比SQL样式查询更好。 - UJS

6
如果where条件没有匹配项,LINQ查询将返回一个空列表(0个项目)。因此,不需要检查null。

4
在您的示例中,使用扩展方法是可以的。但如果您要实现自己的方法并返回一个IEnumerable,答案取决于您如何返回结果。
以下方法返回一个空的可枚举对象:
IEnumerable<object> Correct()
{
    yield break;
}

以下方法只会返回null:
IEnumerable<object> Incorrect()
{
    return null;
}

调用这些方法将会得到以下结果:
Correct().Any(); // returns false
Incorrect().Any(); // throws ArgumentNullException

当你返回IEnumerable时,请谨慎处理。尽量使用yield关键字并遵循正确的模式。


2

我的初步感觉是否定的,但这并不会有害。

我从Phil Haack那里学到了一个有用的扩展方法,可以检查一个IEnumerable是否为null或为空...

    /// <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

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接