2011-05-05 35 views
8
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是一个IEnumerable变量。是否需要为IEnumerable对象进行空检查?

回答

15

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

顺便说一句,我建议你通过写作简化代码:

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

这是短和等效。

+0

真棒..非常感谢hamidi。 – Tanya 2011-05-05 06:07:32

+0

你好! lambda表达式比linq中的查询更好 – UJS 2017-11-09 05:39:41

5

如果没有匹配的地方,LINQ查询将返回一个空列表(0项)。因此,不需要检查null

2

我最初的感觉是不,你不会,但它肯定不会伤害。

我,从我认为菲尔哈克,检查,看看如果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 
} 
1

在你的榜样去,你会没事的使用扩展方法。但是如果你要实现自己的方法返回IEnumerable,答案取决于你如何返回结果。

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

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

下面的方法只是返回null:

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

调用这些方法会给结果如下:

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

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