繁体   English   中英

C#的条件语句

[英]c# Conditional statement with |

鉴于:

bool isBold = true;
bool isItalic = true;
bool isStrikeout = false;
bool isUnderline = true;

System.Drawing.Font MyFont = new System.Drawing.Font(
    thisTempLabel.LabelFont,
    ((float)thisTempLabel.fontSize),
    FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout | FontStyle.Underline,
    GraphicsUnit.Pixel
);

如何应用布尔值确定应该使用的字体样式? 上面的代码使它们都适用,因此为粗体,斜体,删除线和下划线,但是我想根据布尔值进行过滤。

好吧,你可以这样做:

FontStyle style = 0; // No styles
if (isBold)
{
    style |= FontStyle.Bold;
}
if (isItalic)
{
    style |= FontStyle.Italic;
}
// etc

可以使用:

FontStyle style = 0 | (isBold ? FontStyle.Bold : 0)
                    | (isItalic ? FontStyle.Italic : 0)
                    etc

但我不确定是否会。 这有点“花哨”。 请注意,这两个代码位都利用了常量0可隐式转换为任何枚举类型的事实。

除了Jon Skeet提出的建议之外,这也是使用Dictionary<,>的一种更好的方法。 仅对四个项目来说这可能就算是过大了,但也许您会发现这个想法有用:

var map = new Dictionary<bool, FontStyle>
          {
             { isBold, FontStyle.Bold },
             { isItalic, FontStyle.Italic },
             { isStrikeout, FontStyle.Strikeout },
             { isUnderline, FontStyle.Underline }
          };

var style = map.Where(kvp => kvp.Key)
               .Aggregate(FontStyle.Regular, (styleSoFar, next) 
                                            => styleSoFar | next.Value);

我喜欢的是标志和相关样式之间的关联与“按位体操”完全分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM