Enum上的位操作

时间:2009-03-26 08:53:24

标签: c# enums bit bitwise-operators

我遇到以下问题:

  • 我想获得列集合的第一个可见AND冻结列。

我认为这样做会:

DataGridViewColumnCollection dgv = myDataGridView.Columns;
dgv.GetFirstColumn(
     DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
  • 是否也可以使用位掩码来获取第一个冻结的OR可见列?

2 个答案:

答案 0 :(得分:5)

实施是AFAIK,“所有这些” - 它使用:

((this.State & elementState) == elementState);

哪个是“全部”。如果你想写一个“any of”,也许可以添加一个帮助方法: (在DataGridViewColumnCollection之前添加“this”以使其成为C#3.0扩展方法)

    public static DataGridViewColumn GetFirstColumnWithAny(
        DataGridViewColumnCollection columns, // optional "this"
        DataGridViewElementStates states)
    {
        foreach (DataGridViewColumn column in columns)
        {
            if ((column.State & states) != 0) return column;
        }
        return null;
    }

或者使用LINQ:

        return columns.Cast<DataGridViewColumn>()
            .FirstOrDefault(col => (col.State & states) != 0);

答案 1 :(得分:1)

嗯,bitmasks通常这样工作:

|正在加入旗帜。 &正在过滤由位掩码表示的标志集中的标志子集。 ^通过掩码翻转标记(至少在C / C ++中)。

要获得第一个冻结OR可见列GetFirstColumn必须以不同方式处理位掩码(例如GetFirstColumn可以获得匹配任何标志集的第一列,但事实并非如此)。< / p>