c # Условное утверждение с | - PullRequest
1 голос
/ 18 марта 2011

Учитывая:

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

Как бы я применил логические значения, чтобы определить, какие стили шрифта мне следует использовать?Приведенный выше код заставляет их все применяться, поэтому он выделен жирным шрифтом, курсивом, вычеркиванием и подчеркиванием, но я хочу отфильтровать его по bools.

Ответы [ 2 ]

9 голосов
/ 18 марта 2011

Ну, вы могли бы сделать это:

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 неявно преобразуется в любой тип перечисления.

2 голосов
/ 18 марта 2011

В дополнение к тому, что предлагает Джон Скит, есть более причудливый способ с 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);

Что мне нравится в этом, так это то, что связь между флагом и ассоциированным стилем четко отделена от «побитовой гимнастики»..

...