Получить имя Enum на основе значения Enum - PullRequest
6 голосов
/ 02 ноября 2011

Я объявил следующее перечисление:

public enum AfpRecordId
{
    BRG = 0xD3A8C6,
    ERG = 0xD3A9C6
}

и я хочу получить объект enum из значения:

private AfpRecordId GetAfpRecordId(byte[] data)
{
    ...                    
}

Примеры звонков:

byte[] tempData = new byte { 0xD3, 0xA8, 0xC6 };
AfpRecordId tempId = GetAfpRecordId(tempData);

//tempId should be equals to AfpRecordId.BRG

Я также хотел бы использовать linq или lambda, только если они могут дать лучшую или равную производительность.

Ответы [ 3 ]

9 голосов
/ 02 ноября 2011

Simple:

  • Преобразование байтового массива в int (либо вручную, либо путем создания четырехбайтового массива и использования BitConverter.ToInt32)
  • Примените int к AfpRecordId
  • При необходимости вызовите ToString результата (в строке темы предлагается получить имя, но подпись метода говорит только о значении)

Например:

private static AfpRecordId GetAfpRecordId(byte[] data)
{
    // Alternatively, switch on data.Length and hard-code the conversion
    // for lengths 1, 2, 3, 4 and throw an exception otherwise...
    int value = 0;
    foreach (byte b in data)
    {
        value = (value << 8) | b;
    }
    return (AfpRecordId) value;
}

Вы можете использовать Enum.IsDefined, чтобы проверить, действительно ли данные являются действительными ID.

Что касается производительности, прежде чем искать что-то более быстрое, проверьте, дает ли что-то простое достаточную производительность.

1 голос
/ 02 ноября 2011

Предполагая, что tempData имеет 3 элемента, используйте Enum.GetName (typeof (AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2]).

1 голос
/ 02 ноября 2011

Если массив имеет известный размер (я предполагаю, что размер равен 3, как в вашем примере), вы можете сложите элементы вместе и приведите результат к перечислению

private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = tempData[0] * 256*256 + tempData[1] * 256 +tempData[2];
    return (AfpRecordId)temp;
}

другой подход будет использовать вместо этого оператор сдвига

private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = (int)tempData[0]<<16 + (int)tempData[1] * 8 +tempData[2];
    return (AfpRecordId)temp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...