我已经简化了一段延迟执行代码,但是你怎么检查以下不是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>
答案 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
。