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);