C# 有没有一种方法可以使用开关表达式和&&&简化(使眼睛更容易)值的设置?

C# 有没有一种方法可以使用开关表达式和&&&简化(使眼睛更容易)值的设置?,c#,C#,有没有一种方法可以简化值的设置 Current.Resources["PageSideMargin"] = devIsTablet && isLandscape ? new Thickness(150, 0, 150, 0) : devIsTablet && !isLandscape ? new Thickness(100, 0, 100, 0) : new Thickness(0); 我使用过开关表达式,但在选择案例时是否可以在这些表达式中使用&&运算符 请

有没有一种方法可以简化值的设置

 Current.Resources["PageSideMargin"] = devIsTablet && isLandscape ? new Thickness(150, 0, 150, 0) : devIsTablet && !isLandscape ? new Thickness(100, 0, 100, 0) : new Thickness(0);
我使用过开关表达式,但在选择案例时是否可以在这些表达式中使用&&运算符


请注意。我对所有的答案都感兴趣,但如果有人能告诉我如何使用C开关表达式,我会选择接受这个答案。我甚至不介意还有几个字符,因为我的重点是代码的可读性。

它的if-else形式如下

if(devIsTablet && isLandscape)
{
    Current.Resources["PageSideMargin"] = new Thickness(150, 0, 150, 0);
}
else if (devIsTablet /*&& !isLandscape*/)
{
    Current.Resources["PageSideMargin"] = new Thickness(100, 0, 100, 0);
}
else
{
    Current.Resources["PageSideMargin"] = new Thickness(0);
}
如果是这样的话,在第二秒中甚至更进一步!岛景也不是必需的

如果你愿意,这里有另一个版本

if (!devIsTablet || !isLandscape)
{
    if (devIsTablet)
    {
        Current.Resources["PageSideMargin"] = new Thickness(100, 0, 100, 0);
    }
    else
    {
        Current.Resources["PageSideMargin"] = new Thickness(0);
    }
}
else
{
    Current.Resources["PageSideMargin"] = new Thickness(150, 0, 150, 0);
}

我建议您使用带三元运算符的if条件

//If you don't want to assign default value then, you can write this in else condition
Current.Resources["PageSideMargin"] = new Thickness(0); //Assign default value
if(devIsTablet)
{
   //Now you ternary operator
   var hightWidth = isLandscape ? 150 : 100;
   Current.Resources["PageSideMargin"] = new Thickness(hightWidth, 0, hightWidth, 0)

}

如果使用三元If条件使其太不可读,则将其转换为正常的If-else/If块。它可能会占用更多的空间,但可读代码比不可读代码要好。

以下是我将如何编写它。我认为可读性值得额外的打字。如果我用你的方式写的话,我想我的同事会恨我的

Current.Resources["PageSideMargin"] = ComputePageSideMarginThickness(devIsTablet, isLandscape);

Thickness ComputePageSideMarginThickness(bool devIsTablet, bool isLandscape)
{
    if (!devIsTablet) return new Thickness(0);
    var width = isLandscape ? 150 : 100;
    return new Thickness(100, 0, width, 0);
}

一种选择是使用决策矩阵。 例如:

var discriminant = ( devIsTablet ? 2:0 ) + ( isLandscape? 1: 0 );
var thicknessParam = 0;
switch( discriminant )
{
    case 3:
    // device is tablet and tablet is in landscape mode
    thicknessParam = 150;
    break;
    case 2:
    // device is tablet and tablet is in portrait mode
    thicknessParam = 100;       
    break;  
    case 1:
    // device is not a tablet, but it is in landscape mode
    thicknessParam = 0;     
    break;  
    case 0:
    // device is not a tablet and it is in portrait mode
    thicknessParam = 0;             
    break;
    default:
    throw new InvalidOperationException();
}
var pageSideMargin = new Thickness( thicknessParam, 0, thicknessParam, 0 );

如果您迫切需要一个switch表达式,那么下面的内容应该可以完成这项工作,尽管我不确定它是否比If-else表单更可读:


由于您特别要求使用switch表达式来实现这一点,因此以下是实现方法:

Current.Resources["PageSideMargin"] = (devIsTablet, isLandscape) switch
{
    (true, true) => new Thickness(150, 0, 150, 0),
    (true, false) => new Thickness(100, 0, 100, 0),
    _ => new Thickness(0)
};
您可以使用值元组切换不同的组合。当然,这是否更具可读性是主观的。您也可以选择在开关案例中包括元组元素名称:

Current.Resources["PageSideMargin"] = (devIsTablet, isLandscape) switch
{
    (devIsTablet: true, isLandscape: true) => new Thickness(150, 0, 150, 0),
    (devIsTablet: true, isLandscape: false) => new Thickness(100, 0, 100, 0),
    _ => new Thickness(0)
};

如果您想根据不同的尺寸调整其口径,可以使用数学方法更改50、2和1,并查看结果:

var a = 50 * ((devIsTablet ? 2 : 0) + (isLandscape ? 1 : 0));
Current.Resources["PageSideMargin"] = new Thickness(a, 0, a, 0);

如果可能的话,我真的希望找到一个使用switch表达式的解决方案。只是不知道如何为这些人辩护。让我们拭目以待,看看是否有人能想出这个答案。如果可能的话,我真的希望找到一个使用switch表达式的解决方案。只是不知道如何为这些人辩护。让我们拭目以待,看看是否有人能想出这个答案。@snr,我们可以使用C8功能。看看其他答案,如果可能的话,我真的希望找到一个使用开关表达式的解决方案。只是不知道如何为这些人辩护。让我们拭目以待,看看是否有人能想出这个答案。
var a = 50 * ((devIsTablet ? 2 : 0) + (isLandscape ? 1 : 0));
Current.Resources["PageSideMargin"] = new Thickness(a, 0, a, 0);