IEnumerable对象是否需要空检查?

时间:2011-05-05 05:48:46

标签: c# .net linq linq-to-objects

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 个答案:

答案 0 :(得分:20)

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

顺便说一句,我建议您通过编写简化代码来简化:

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

哪个更短且相当。

答案 1 :(得分:6)

如果在哪里没有匹配项,LINQ查询将返回一个空列表(0项)。

因此,无需检查null

答案 2 :(得分:2)

我最初的感觉是不,你没有,但肯定不会受伤。

我认为Phil Haack是一个有用的扩展方法,可以检查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()

效率更高

答案 3 :(得分:2)

在您的示例中,您可以使用扩展方法。但是如果你要实现自己的返回IEnumerable的方法,答案取决于你返回结果的方式。

以下方法返回一个空的可枚举:

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

以下方法只返回n​​ull:

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

调用这些方法将得到以下结果:

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

返回IEnumerable时要小心。尝试使用yield关键字并遵循正确的模式。

答案 4 :(得分:1)

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
}