web-dev-qa-db-ja.com

Char Enumを取得するためのより良い方法

C#で列挙型のchar値を取得するよりきれいな方法はありますか?.

 public enum DivisionStatus
        {
            None = 'N',
            Active = 'A',
            Inactive = 'I',
            Waitlist = 'W'
        }

string status = Enums.DivisionStatus.Active.ToString()[0].ToString(); // "A"
21
Mike Flynn

値をキャストするだけです:

char status = (char)Enums.DivisionStatus.Active;

これは識別子の代わりに値を使用することに注意してください。 Enums.DivisionStatus.Active値は、'A'の文字コードです。これは、ユーザーが定義した値であるためです。

値を直接使用する方が、値の識別子を検索するよりも高速です。

36
Guffa

私は問題を解決する「疑似列挙型」を構築します。あなたの場合、それは次のようになります:

public class DivisionStatus
{
    public static readonly DivisionStatus None = new DivisionStatus('N');
    public static readonly DivisionStatus Active = new DivisionStatus('A');
    public static readonly DivisionStatus Inactive = new DivisionStatus('I');
    public static readonly DivisionStatus Waitlist = new DivisionStatus('W');

    internal char Value { get; private set; }

    public override string ToString()
    {
        return Value.ToString();
    }

    protected DivisionStatus(char value)
    {
        this.Value = value;
    }
}

キャストせずにToString()のchar enum値を返すenumのように使用できます。

Console.WriteLine(DivisionStatus.None); // returns 'N'

静的クラスを使用することもできます。ただし、常に値を文字列として使用する場合は、各プロパティを文字列にするのと同じくらい簡単にできます。この方法の1つの利点は、InteliSenseに表示される各アイテムの説明を追加できることです。

public static class DivisionStatus
{
    /// <summary>
    /// Some information about None
    /// </summary>
    public const char None = 'N';
    /// <summary>
    /// Some information about Active, blah blah
    /// </summary>
    public const char Active = 'A';
    /// <summary>
    /// Some information about Inactive, blah blah
    /// </summary>
    public const char Inactive = 'I';
    /// <summary>
    /// Some information about Waitlist, blah blah
    /// </summary>
    public const char Waitlist = 'W';
}
3
Jason L.

シンプルなキャスティングが機能し、私はそれを試しました:

using System;

public enum DivisionStatus
{
  None = 'N',
  Active = 'X',
  Inactive = 'I',
  Waitlist = 'W'
}

class Program
{
  public static void Main()
  {
    var ds = DivisionStatus.Active;
    Console.WriteLine((char)ds);
  }
}
2
kol

var status = (char)Enums.DivisionStatus.Active;は、望みどおりの動作をします。 enumテキストの最初の文字が基になるchar値と一致しない場合、以前の方法ではうまくいかなかったでしょう。

これは、バッキングタイプとしてintを持つ列挙型でも機能します。

1
Daniel Mann

ToStringを呼び出さずにenum値をキャストするだけです。

var status = (char)DivisionStatus.Active;

または多分あなたはする必要があるでしょう

var status = (char)(int)DivisionStatus.Active;
0
phoog