如何在进一步处理之前检查列表中的任何空值?

时间:2018-11-14 12:44:55

标签: c#

我正在将列表传递给对该列表进行操作的方法。但是,首先,我想遍历该列表,并在进行任何进一步处理之前检查列表中是否有空值。

最初,我认为使用if (questions == null || questions.Any() == false || questions.All(q => q == null)) { throw new ArgumentException("Exception raised."); } 方法会有所帮助,但是此方法实际上会检查列表中的所有元素是否满足条件,我想依次检查每个元素,如果有则为null,则处理这个。

这是我已经拥有的(无效)代码。我不确定如何在if语句条件下使用它。

{{1}}

基本上我要检查:

  1. 问题不为空。
  2. 问题不为空。
  3. 问题中包含的任何元素都不是空值。

前两个已经完成,只是第三个。

3 个答案:

答案 0 :(得分:5)

您可以使用更简洁的版本,该版本使用Any?-operator

bool valid = questions?.Any(q => q != null) == true;
if (!valid)
   throw new ArgumentException("Exception raised.");

true进行比较对于将bool?转换为bool是必要的。它也可能更有效,因为它不需要多次执行(如果questions是一个查询)。它还处理questions为空,然后Any返回false的情况。

答案 1 :(得分:2)

我想你想

if (questions != null && questions.Any() && questions.All(q => q != null))

答案 2 :(得分:1)

我建议分为两个测试-对于questions本身(不能为null)和questions内的项目(必须至少有两个)不是null个项目);您当前的代码已更改:

if (null == questions)
  throw new ArgumentNullException(nameof(questions));
else if (questions.All(q => q == null))
  throw new ArgumentException("At least one not null question expected.",
                               nameof(questions)); 

甚至:在实施合同时,对于您来说是

  
      
  1. questions不是null
  2.   
  3. questions不为空。
  4.   
  5. questions中包含的任何元素都不是null值。
  6.   
每次违规

尝试抛出单独的异常

 if (null == questions)
   throw new ArgumentNullException(nameof(questions));
 else if (!questions.Any())
   throw new ArgumentException("Questions must not be empty.",
                                nameof(questions)); 
 else if (questions.Any(item => null == item))
   throw new ArgumentException("Null questions are not allowed.",
                                nameof(questions)); 

这种实现可能看起来很冗长,但是可以节省调试时的时间("Exception raised."的含义显而易见时,"Questions must not be empty."不提供任何信息)。