使用 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.MaxMath.Min 来完成钳位。当不需要进行检查时,可以通过传递 int.MinValueint.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;

在我看来这很简单并且可读性很好。