J'ai cherché ceci en ligne mais je ne peux pas trouver la réponse que je cherche. Fondamentalement, j'ai l'énumération suivante:
public enum typFoo : int
{
itemA : 1,
itemB : 2
itemC : 3
}
Comment puis-je convertir cette énumération en dictionnaire afin qu'il soit stocké dans le dictionnaire suivant
Dictionary<int,string> mydic = new Dictionary<int,string>();
et mydic ressemblerait à ceci:
1, itemA
2, itemB
3, itemC
Des idées?
voir: Comment énumérer un enum?
foreach( typFoo foo in Enum.GetValues(typeof(typFoo)) )
{
mydic.Add((int)foo, foo.ToString());
}
Essayer:
var dict = Enum.GetValues(typeof(typFoo))
.Cast<typFoo>()
.ToDictionary(t => (int)t, t => t.ToString() );
Adapter la réponse de Ani pour qu'elle puisse être utilisée comme méthode générique (merci, toddmo )
public static Dictionary<int, string> EnumDictionary<T>()
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Type must be an enum");
return Enum.GetValues(typeof(T))
.Cast<T>()
.ToDictionary(t => (int)(object)t, t => t.ToString());
}
ArgumentException
si le type n'est pas System.Enum
, grâce à Enum.GetValues
enum
n'est encore disponible)public static Dictionary<T, string> ToDictionary<T>() where T : struct
=> Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(e => e, e => e.ToString());
public static class EnumHelper
{
public static IDictionary<int, string> ConvertToDictionary<T>() where T : struct
{
var dictionary = new Dictionary<int, string>();
var values = Enum.GetValues(typeof(T));
foreach (var value in values)
{
int key = (int) value;
dictionary.Add(key, value.ToString());
}
return dictionary;
}
}
Utilisation:
public enum typFoo : int
{
itemA = 1,
itemB = 2,
itemC = 3
}
var mydic = EnumHelper.ConvertToDictionary<typFoo>();
Voici la version VB.NET de la réponse d'Ani:
Public Enum typFoo
itemA = 1
itemB = 2
itemC = 3
End Enum
Sub example()
Dim dict As Dictionary(Of Integer, String) = System.Enum.GetValues(GetType(typFoo)) _
.Cast(Of typFoo)() _
.ToDictionary(Function(t) Integer.Parse(t), Function(t) t.ToString())
For Each i As KeyValuePair(Of Integer, String) In dict
MsgBox(String.Format("Key: {0}, Value: {1}", i.Key, i.Value))
Next
End Sub
Dans mon cas, je voulais sauvegarder le chemin des répertoires importants et les stocker dans la section AppSettings de mon web.config. Ensuite, j'ai créé une énumération pour représenter les clés de ces paramètres d'application ... mais mon ingénieur frontal avait besoin d'accéder à ces emplacements dans nos fichiers JavaScript externes. J'ai donc créé le bloc de code suivant et l'ai placé dans notre page maître principale. Désormais, chaque nouvel élément Enum créera automatiquement une variable javascript correspondante. Voici mon bloc de code:
<script type="text/javascript">
var rootDirectory = '<%= ResolveUrl("~/")%>';
// This next part will loop through the public enumeration of App_Directory and create a corresponding javascript variable that contains the directory URL from the web.config.
<% Dim App_Directories As Dictionary(Of String, App_Directory) = System.Enum.GetValues(GetType(App_Directory)) _
.Cast(Of App_Directory)() _
.ToDictionary(Of String)(Function(dir) dir.ToString)%>
<% For Each i As KeyValuePair(Of String, App_Directory) In App_Directories%>
<% Response.Write(String.Format("var {0} = '{1}';", i.Key, ResolveUrl(ConfigurationManager.AppSettings(i.Value))))%>
<% next i %>
</script>
NOTE: Dans cet exemple, j'ai utilisé le nom de l'énum en tant que clé (pas la valeur int).
Vous pouvez énumérer les descripteurs d’énumération:
Dictionary<int, string> enumDictionary = new Dictionary<int, string>();
foreach(var name in Enum.GetNames(typeof(typFoo))
{
enumDictionary.Add((int)((typFoo)Enum.Parse(typeof(typFoo)), name), name);
}
Cela devrait mettre la valeur de chaque élément et le nom dans votre dictionnaire.
Une autre méthode d'extension qui s'appuie sur l'exemple des Arithmomanes ci-dessus.
/// <summary>
/// Returns a Dictionary<int, string> of the parent enumeration. Note that the extension method must
/// be called with one of the enumeration values, it does not matter which one is used.
/// Sample call: var myDictionary = StringComparison.Ordinal.ToDictionary().
/// </summary>
/// <param name="enumValue">An enumeration value (e.g. StringComparison.Ordianal).</param>
/// <returns>Dictionary with Key = enumeration numbers and Value = associated text.</returns>
public static Dictionary<int, string> ToDictionary(this Enum enumValue)
{
var enumType = enumValue.GetType();
return Enum.GetValues(enumType)
.Cast<Enum>()
.ToDictionary(t => (int)(object)t, t => t.ToString());
}
En utilisant la réflexion:
Dictionary<int,string> mydic = new Dictionary<int,string>();
foreach (FieldInfo fi in typeof(typFoo).GetFields(BindingFlags.Public | BindingFlags.Static))
{
mydic.Add(fi.GetRawConstantValue(), fi.Name);
}
Si vous n'avez besoin que du nom, vous n'avez pas du tout besoin de créer ce dictionnaire.
Cela va convertir enum en int:
int pos = (int)typFoo.itemA;
Cela convertira int en enum:
typFoo foo = (typFoo) 1;
Et ceci vous retransmettra le nom de celui-ci:
((typFoo) i).toString();
public class EnumUtility
{
public static string GetDisplayText<T>(T enumMember)
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
var a = enumMember
.GetType()
.GetField(enumMember.ToString())
.GetCustomAttribute<DisplayTextAttribute>();
return a == null ? enumMember.ToString() : a.Text;
}
public static Dictionary<int, string> ParseToDictionary<T>()
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
Dictionary<int, string> dict = new Dictionary<int, string>();
T _enum = default(T);
foreach(var f in _enum.GetType().GetFields())
{
if(f.GetCustomAttribute<DisplayTextAttribute>() is DisplayTextAttribute i)
dict.Add((int)f.GetValue(_enum), i == null ? f.ToString() : i.Text);
}
return dict;
}
public static List<(int Value, string DisplayText)> ParseToTupleList<T>()
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
List<(int, string)> tupleList = new List<(int, string)>();
T _enum = default(T);
foreach (var f in _enum.GetType().GetFields())
{
if (f.GetCustomAttribute<DisplayTextAttribute>() is DisplayTextAttribute i)
tupleList.Add(((int)f.GetValue(_enum), i == null ? f.ToString() : i.Text));
}
return tupleList;
}
}