2011-03-18 3 views
1

을 감안할 때 :C# 조건부 명령문 |

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

어떻게 부울 값을 내가 사용되어야하는 글꼴 스타일 결정을 적용 할 것인가? 위의 코드는 그것들을 모두 적용하게하므로 굵게, 기울임 꼴, 삼각형 및 밑줄을 사용하지만 bool을 기반으로 필터링하고 싶습니다.

답변

9

글쎄, 당신이 할 수 있습니다 :

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이 암시 적으로 모든 enum 유형으로 변환 될 수 있다는 사실을 사용합니다.

+0

감사! 열거 형에 대해 배우는 것만으로도 이제는 내게 훨씬 더 이해가됩니다. –

+0

"if"가되어야합니다. 맞습니까? – TheSean

+0

@ TheSean : 예, 그냥 오타입니다. –

2

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

내가 그것에 대해 좋아하는 것은 깨끗하게 '비트 체조'분리 된 플래그와 관련된 스타일 사이의 연결이입니다.

관련 문제