在 C# 中对 if then 进行空检查
Null checking for if then in C#
我正在检查 C# 中的两个条件:
if (result.Data.Count > 0)
{
if(result.Data[0].AdditionalData != null)
{
// To Do
}
}
我的困惑是有没有更好的方法在一个 if 条件下检查这些?
我正在尝试使用 Null-Condition 运算符,但没有成功。 Null-Conditional operator in MSDN
您可以在 IEnumerable 上创建扩展方法并使用它
public static bool HasValue<T>(this IEnumerable<T> source, int index)
{
if (source == null)
return false;
return source.Count() > index && source.ElementAt(index) != null;
}
// usage
if(result.Data.HasValue(0))
{
}
就像@Hans Killian 也写的一样,尝试使用已经存在的扩展 IEnumerables
在你的情况下,我认为 .ElementAtOrDefault(0)
(或者如果你总是想使用索引 0,只需使用 .FirstOrDefault()
)最适合你。
if (result?.Data != null)
{
/// Expecting 'AdditionalData' is `string`
if (!string.IsNullOrEmpty(result.Data.ElementAtOrDefault(0)?.AdditionalData))
{
Console.WriteLine("Null check working...");
}
else
{
Console.WriteLine("AdditionalData is null or empty!");
}
}
else
{
Console.WriteLine("No data!");
}
可以找到完整的工作示例here
空条件可以与 Any
一起工作,并短路下一个检查
if (result?.Data?.Any() && result.Data[0]?.AdditionalData != null)
{
// to do
}
每个步骤的解释
result?
结果不为空吗?
Data?
如果是,数据不为空吗?
Any()
如果有,Data 有没有项目?
Data[0]?
如果是这样,第一项不是空的吗? (我在这里使用索引的原因是因为你可能想检查第n项,所以FirstOrDefault
可能太严格了)
AdditionalData != null
如果是,附加数据是否不为空?
当然,如果这些检查中的任何一个是不必要的或多余的,您可以从链中删除特定的检查(在 null 条件的情况下删除 ?
)。这里的检查都清楚地排在一行中,因此修改逻辑链很简单。
一个衬垫使用 System.Linq
。
if (result.Data.FirstOrDefault()?.AdditionalDate != null)
{
}
我认为获得干净良好代码的最佳方法是使用 FluentValidation。请注意以下代码片段:
public class RegisterValidator : AbstractValidator<RegisterDTO>
{
public RegisterValidator()
{
RuleFor(a => a.PhoneNumber).NotNull().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).NotEmpty().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).MinimumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).MaximumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
}
}
以上代码是验证模型以检查 null、empty 等的示例,此代码必须检查业务逻辑中的验证:
var validator = new RegisterValidator();
var validatorResult = await validator.ValidateAsync(register);
if (!validatorResult.IsValid)
return BadRequest("", validatorResult.Errors[0].ToString());
使用起来很简单,也很干净。你甚至可以通过错误列表进行多次检查并得到结果
这个link是FluentValidation
的网址
我正在检查 C# 中的两个条件:
if (result.Data.Count > 0)
{
if(result.Data[0].AdditionalData != null)
{
// To Do
}
}
我的困惑是有没有更好的方法在一个 if 条件下检查这些?
我正在尝试使用 Null-Condition 运算符,但没有成功。 Null-Conditional operator in MSDN
您可以在 IEnumerable 上创建扩展方法并使用它
public static bool HasValue<T>(this IEnumerable<T> source, int index)
{
if (source == null)
return false;
return source.Count() > index && source.ElementAt(index) != null;
}
// usage
if(result.Data.HasValue(0))
{
}
就像@Hans Killian 也写的一样,尝试使用已经存在的扩展 IEnumerables
在你的情况下,我认为 .ElementAtOrDefault(0)
(或者如果你总是想使用索引 0,只需使用 .FirstOrDefault()
)最适合你。
if (result?.Data != null)
{
/// Expecting 'AdditionalData' is `string`
if (!string.IsNullOrEmpty(result.Data.ElementAtOrDefault(0)?.AdditionalData))
{
Console.WriteLine("Null check working...");
}
else
{
Console.WriteLine("AdditionalData is null or empty!");
}
}
else
{
Console.WriteLine("No data!");
}
可以找到完整的工作示例here
空条件可以与 Any
一起工作,并短路下一个检查
if (result?.Data?.Any() && result.Data[0]?.AdditionalData != null)
{
// to do
}
每个步骤的解释
result?
结果不为空吗?
Data?
如果是,数据不为空吗?
Any()
如果有,Data 有没有项目?
Data[0]?
如果是这样,第一项不是空的吗? (我在这里使用索引的原因是因为你可能想检查第n项,所以FirstOrDefault
可能太严格了)
AdditionalData != null
如果是,附加数据是否不为空?
当然,如果这些检查中的任何一个是不必要的或多余的,您可以从链中删除特定的检查(在 null 条件的情况下删除 ?
)。这里的检查都清楚地排在一行中,因此修改逻辑链很简单。
一个衬垫使用 System.Linq
。
if (result.Data.FirstOrDefault()?.AdditionalDate != null)
{
}
我认为获得干净良好代码的最佳方法是使用 FluentValidation。请注意以下代码片段:
public class RegisterValidator : AbstractValidator<RegisterDTO>
{
public RegisterValidator()
{
RuleFor(a => a.PhoneNumber).NotNull().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).NotEmpty().WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).MinimumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
RuleFor(a => a.PhoneNumber).MaximumLength(11).WithMessage(Utility.GetEnumTitlePersian(enmErrorMessage.InValidMobileNumber));
}
}
以上代码是验证模型以检查 null、empty 等的示例,此代码必须检查业务逻辑中的验证:
var validator = new RegisterValidator();
var validatorResult = await validator.ValidateAsync(register);
if (!validatorResult.IsValid)
return BadRequest("", validatorResult.Errors[0].ToString());
使用起来很简单,也很干净。你甚至可以通过错误列表进行多次检查并得到结果
这个link是FluentValidation
的网址