使用C#6简化条件表达式

时间:2016-06-04 12:38:46

标签: c# c#-6.0

我有以下条件:

Int32 pageSize = query.PageSize == null ? _apiSettings.DefaultPageSize : (query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit : query.PageSize.Value);

是否可以使用C#6简化此表达式?

4 个答案:

答案 0 :(得分:3)

很明显,声明很复杂,我猜你需要所有检查。在同一行中使用三元运算符两次只是让我觉得它不可读。

为了使其更具可读性(因此以某种方式简化它),我只需将逻辑提取为如下方法:

Int32 pageSize = GetPageSize(query.PageSize);

...

In32 GetPageSize(Int32 queryPageSize)
{
    if (queryPageSize == null)
        return _apiSettings.DefaultPageSize;

    if (queryPageSize > _apiSettings.PageSizeLimit)
        return _apiSettings.PageSizeLimit;

    return queryPageSize;
}

答案 1 :(得分:2)

你不需要C#6中的任何新东西。通常可以使用Math.MaxMath.Min进行钳位。如果不进行检查,可以通过传递int.MinValueint.MaxValue来完成夹紧选择。

var pageSize = Math.Min(
    query.PageSize ?? _apiSettings.DefaultPageSize,
    _apiSettings.PageSizeLimit ?? int.MaxValue);

我假设PageSizeLimit在这里可以为空,但如果不可以,则只需取出?? int.MaxValue

请注意,这并非严格等同:如果DefaultPageSize > PageSizeLimit,则会产生不同的结果。但是考虑到你的属性名称,这似乎是你不需要支持的场景,或者如果你确实需要支持它,你将其限制为PageSizeLimit以及我在这里。

答案 2 :(得分:1)

不,因为这样或那样你必须检查2个条件(空检查和阈值检查)。
然而,你可以这样简化:

Int32 pageSize = 
    query.PageSize == null 
    ? _apiSettings.DefaultPageSize
    : Math.Min(query.PageSize, _apiSettings.PageSizeLimit);

答案 3 :(得分:0)

一个非常简单的简化就是摆脱括号,然后重新格式化:

Int32 pageSize =
    query.PageSize == null ? _apiSettings.DefaultPageSize :
    query.PageSize > _apiSettings.PageSizeLimit ? _apiSettings.PageSizeLimit :
    query.PageSize.Value;

在我看来,这很简单易读。