在c#中测试'lazy loaded'null IEnumerable?

时间:2017-04-11 08:21:17

标签: c# linq ienumerable

我已经简化了一段延迟执行代码,但是你怎么检查以下不是null / empty而不将它包装在try / catch中?

       <ul class="subjects">
 <?php
 //db query
 $query ="SELECT * FROM  `subjects` ";
 $query.="WHERE visible = 1 ";
 $query.="ORDER BY position ASC";
 $subject_set = mysqli_query($connection, $query);
 confirm_query($subject_set); ?>
 <?php while($subject=mysqli_fetch_assoc($subject_set))    
 {
 ?>
 <li>
 <?php
 echo $subject['menu_name'];
 } ?> 

 <?php
 $query ="SELECT * FROM  `pages` ";
 $query.="WHERE visible = 1 ";
 $query.="AND subject_id ={$subject["id"]}";
 $query.="ORDER BY subject_id ASC";
 $page_set= mysqli_query($connection, $query);
 echo mysqli_error($connection);
 confirm_query($page_set);
 ?>
 <ul class="pages">
 <?php
 while($page= mysqli_fetch_assoc($page_set)){
 ?>
 <li>
 <?php echo $page['menu_name'];?>
 </li><!---page_ul,li-->
 <?php
 } 
 mysqli_free_result($page_set);
 ?>
 </ul><!--pages_ul-->
 </li>
 </div><!--navigation-->
 </ul><!--ul-subjects-->
 <?php 
 mysqli_free_result($page_set);
 ?>
 </div>

4 个答案:

答案 0 :(得分:3)

你只需要让你的lambda对null条目更具弹性:

IEnumerable<string> ienumerable = new[] { nullCollection }
    .SelectMany(a => a ?? Enumerable.Empty<string>());

bool isany = ienumerable.Any(); // Sets isany to 'false'

答案 1 :(得分:3)

你不能这样做,因为那与询问&#34相同;如何在不调用它的情况下告诉该方法不会抛出NullReferenceException?&#34;。没有其他线索唯一的方法是实际调用这样的方法并观察结果。枚举IEnumerable只是在它的枚举器上调用一堆MoveNext个调用,任何此类调用都可能抛出任何异常。

答案 2 :(得分:2)

您可以检查枚举器中的当前项是否为空

foo.*bar

答案 3 :(得分:0)

由于Linq方法是IEnumerable上的扩展方法,因此可以进一步包装这些扩展:使用扩展方法,接收扩展的对象可以为null。

    public static IEnumerable<TResult> SafeSelectMany<T, TCollection, TResult>(
            this IEnumerable<T> source, 
            Func<T, IEnumerable<TCollection>> collectionSelector, 
            Func<T, TCollection, TResult> resultSelector)
    {
        if (source == null)
        {
            return null;
        }
        IEnumerable<TResult> result = source.SelectMany(collectionSelector, resultSelector);
        return result;
    }

您还可以为List<TResult>返回空null而不是source==null