使用 C# 6 简化条件表达式
Simplify conditional expression using C# 6
我有以下条件:
Int32 pageSize = query.PageSize == null ? _apiSettings.DefaultPageSize : (query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit : query.PageSize.Value);
是否可以使用 C# 6 来简化此表达式?
很明显,该声明非常复杂,我想您需要在那里进行所有检查。在我看来,在同一行中两次使用三元运算符只会让它变得不可读。
为了使其更具可读性(并因此以某种方式简化它),我只是将逻辑提取为这样的方法:
Int32 pageSize = GetPageSize(query.PageSize);
...
In32 GetPageSize(Int32 queryPageSize)
{
if (queryPageSize == null)
return _apiSettings.DefaultPageSize;
if (queryPageSize > _apiSettings.PageSizeLimit)
return _apiSettings.PageSizeLimit;
return queryPageSize;
}
为此,您不需要 C# 6 中的任何新功能。通常可以使用 Math.Max
和 Math.Min
来完成钳位。当不需要进行检查时,可以通过传递 int.MinValue
或 int.MaxValue
来使夹紧可选。
var pageSize = Math.Min(
query.PageSize ?? _apiSettings.DefaultPageSize,
_apiSettings.PageSizeLimit ?? int.MaxValue);
我假设 PageSizeLimit
在这里可以为空,但如果不是,只需取出 ?? int.MaxValue
.
请注意,这并不是严格等价的:如果 DefaultPageSize > PageSizeLimit
,它会给出不同的结果。但是考虑到你的 属性 名字,这似乎是你不需要支持的场景,或者如果你确实需要支持它,你 应该 将其限制为 PageSizeLimit
就像我在这里所做的那样。
不,因为那样或那样你必须检查 2 个条件(空检查和阈值检查)。
不过,您可以这样简化它:
Int32 pageSize =
query.PageSize == null
? _apiSettings.DefaultPageSize
: Math.Min(query.PageSize, _apiSettings.PageSizeLimit);
一个非常简单的简化就是去掉括号,然后重新格式化:
Int32 pageSize =
query.PageSize == null ? _apiSettings.DefaultPageSize :
query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit :
query.PageSize.Value;
在我看来这很简单并且可读性很好。
我有以下条件:
Int32 pageSize = query.PageSize == null ? _apiSettings.DefaultPageSize : (query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit : query.PageSize.Value);
是否可以使用 C# 6 来简化此表达式?
很明显,该声明非常复杂,我想您需要在那里进行所有检查。在我看来,在同一行中两次使用三元运算符只会让它变得不可读。
为了使其更具可读性(并因此以某种方式简化它),我只是将逻辑提取为这样的方法:
Int32 pageSize = GetPageSize(query.PageSize);
...
In32 GetPageSize(Int32 queryPageSize)
{
if (queryPageSize == null)
return _apiSettings.DefaultPageSize;
if (queryPageSize > _apiSettings.PageSizeLimit)
return _apiSettings.PageSizeLimit;
return queryPageSize;
}
为此,您不需要 C# 6 中的任何新功能。通常可以使用 Math.Max
和 Math.Min
来完成钳位。当不需要进行检查时,可以通过传递 int.MinValue
或 int.MaxValue
来使夹紧可选。
var pageSize = Math.Min(
query.PageSize ?? _apiSettings.DefaultPageSize,
_apiSettings.PageSizeLimit ?? int.MaxValue);
我假设 PageSizeLimit
在这里可以为空,但如果不是,只需取出 ?? int.MaxValue
.
请注意,这并不是严格等价的:如果 DefaultPageSize > PageSizeLimit
,它会给出不同的结果。但是考虑到你的 属性 名字,这似乎是你不需要支持的场景,或者如果你确实需要支持它,你 应该 将其限制为 PageSizeLimit
就像我在这里所做的那样。
不,因为那样或那样你必须检查 2 个条件(空检查和阈值检查)。
不过,您可以这样简化它:
Int32 pageSize =
query.PageSize == null
? _apiSettings.DefaultPageSize
: Math.Min(query.PageSize, _apiSettings.PageSizeLimit);
一个非常简单的简化就是去掉括号,然后重新格式化:
Int32 pageSize =
query.PageSize == null ? _apiSettings.DefaultPageSize :
query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit :
query.PageSize.Value;
在我看来这很简单并且可读性很好。