6

このような列挙型が与えられた場合:

public enum City {
    London    = 1,
    Liverpool  = 20,
    Leeds       = 25
}

public enum House {
    OneFloor    = 1,
    TwoFloors = 2
}

次のコードを使用してIEnumerableを取得しています。

City[] values = (City[])Enum.GetValues(typeof(City)); 
var valuesWithNames = from value in values                       
   select new { value = (int)value, name = value.ToString() }; 

コードは非常にうまく機能しますが、かなり多くの列挙型に対してこれを実行する必要があります。これを行う一般的な方法を作成する方法はありますか?

4

3 に答える 3

3

ジョンスキートの制約のないメロディーを使用してください。

using UnconstrainedMelody;

列挙値をに入れて、Dictionary<int, string>それらを列挙することができます。

var valuesAsDictionary = Enums.GetValues<City>()
                              .ToDictionary(key => (int)key, value => value.ToString());

しかし、おそらくそれを行う必要はありません。値を直接列挙してみませんか?

foreach (var value in Enums.GetValues<City>())
{
    Console.WriteLine("{0}: {1}", (int)value, value);
}
于 2012-09-16T15:25:17.323 に答える
2

この関数はあなたを助けるかもしれません:

public static IEnumerable<KeyValuePair<int, string>> GetValues<T>() where T : struct
{
        var t = typeof(T);
        if(!t.IsEnum)
            throw new ArgumentException("Not an enum type");

        return Enum.GetValues(t).Cast<T>().Select (x => 
               new KeyValuePair<int, string>(
                   (int)Enum.ToObject(t, x), 
                    x.ToString()));
}

使用法:

var values = GetValues<City>();
于 2012-09-16T15:21:56.950 に答える
1

なぜだめですか:

    IEnumerable<object> GetValues<T>()
    {
        return Enum.GetValues(typeof (T))
                   .Cast<T>()
                   .Select(value => new {     
                                             value = Convert.ToInt32(value),
                                             name = value.ToString()
                                         });

    }

したがって、次を使用できます。

var result = GetValues<City>();

制約をとしてジェネリックにしたい場合、ジェネリック制約Tとして直接使用することはできませんがenum、列挙はインターフェイスから継承するため、この方法で問題ないと考えてください。enum IConvertible

IEnumerable<object> GetValues<T>() where T: struct, IConvertible
{}

に置き換えるIEnumerable<object>にはDictionary

Dictionary<int, string> GetValues<T>() where T :  struct, IConvertible
{
    return Enum.GetValues(typeof (T)).Cast<T>()
               .ToDictionary(value => Convert.ToInt32(value),
                             value => value.ToString());
}

編集:マグナスのコメントとして、アイテムの順序を確認する必要がある場合、辞書はオプションではありません。独自の強い型を定義する方がよいでしょう。

于 2012-09-16T15:10:22.123 に答える