我正在将列表传递给对该列表进行操作的方法。但是,首先,我想遍历该列表,并在进行任何进一步处理之前检查列表中是否有空值。
最初,我认为使用if (questions == null || questions.Any() == false || questions.All(q => q == null))
{
throw new ArgumentException("Exception raised.");
}
方法会有所帮助,但是此方法实际上会检查列表中的所有元素是否满足条件,我想依次检查每个元素,如果有则为null,则处理这个。
这是我已经拥有的(无效)代码。我不确定如何在if语句条件下使用它。
{{1}}
基本上我要检查:
前两个已经完成,只是第三个。
答案 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));
甚至三:在实施合同时,对于您来说是
每次违规
questions
不是null
。questions
不为空。questions
中包含的任何元素都不是null
值。
尝试抛出单独的异常:
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."
不提供任何信息)。