Если вы обрабатываете большой объем данных (много мегабайт), вы хотите использовать XmlReader
для потоковой обработки XML-файла.
Что-нибудь еще (XPathNavigator
, XElement
, XmlDocument
и даже XmlSerializer
, если вы сохраняете полный график объектов) приведет к использованию большой памяти , а также к очень медленному времени загрузки.
Конечно, если вы все равно нужны все данные в памяти, тогда у вас может не быть выбора.
Array values = Enum.GetValues(typeof(myEnum));
foreach( MyEnum val in values )
{
Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
}
Или, можно бросить Систему. Массив, который возвращается:
string[] names = Enum.GetNames(typeof(MyEnum));
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
for( int i = 0; i < names.Length; i++ )
{
print(names[i], values[i]);
}
, Но, можно ли быть уверены, что GetValues возвращает значения в том же порядке, как GetNames возвращает имена?
Массив имеет GetValue (Int32) метод, который можно использовать для получения значения в указанном индексе.
Что относительно того, чтобы использовать цикл foreach, возможно, Вы могли работать с этим?
int i = 0;
foreach (var o in values)
{
print(names[i], o);
i++;
}
что-то как этот, возможно?
Необходимо бросить массив - возвращенный массив на самом деле имеет требуемый тип, т.е. myEnum[]
, если Вы просите typeof(myEnum)
:
myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));
Затем values[0]
и т.д.
Как насчет списка словаря?
Dictionary<string, int> list = new Dictionary<string, int>();
foreach( var item in Enum.GetNames(typeof(MyEnum)) )
{
list.Add(item, (int)Enum.Parse(typeof(MyEnum), item));
}
и конечно можно изменить тип значения словаря на то, что перечислимые значения.
Можно бросить тот Массив к различным типам Массивов:
myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));
или если Вы хотите целочисленные значения:
int[] values = (int[])Enum.GetValues(typeof(myEnum));
можно выполнить итерации тех литых массивов, конечно, :)
Вот простой способ перебрать ваш пользовательский объект Enum
For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum))
Print([Enum].GetName(GetType(MyEnum), enumValue).ToString)
Next
Вот еще один. У нас была необходимость предоставить дружественные имена для наших EnumValues. Мы использовали System.ComponentModel.DescriptionAttribute, чтобы показать пользовательское строковое значение для каждого перечисления.
public static class StaticClass
{
public static string GetEnumDescription(Enum currentEnum)
{
string description = String.Empty;
DescriptionAttribute da;
FieldInfo fi = currentEnum.GetType().
GetField(currentEnum.ToString());
da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
typeof(DescriptionAttribute));
if (da != null)
description = da.Description;
else
description = currentEnum.ToString();
return description;
}
public static List<string> GetEnumFormattedNames<TEnum>()
{
var enumType = typeof(TEnum);
if (enumType == typeof(Enum))
throw new ArgumentException("typeof(TEnum) == System.Enum", "TEnum");
if (!(enumType.IsEnum))
throw new ArgumentException(String.Format("typeof({0}).IsEnum == false", enumType), "TEnum");
List<string> formattedNames = new List<string>();
var list = Enum.GetValues(enumType).OfType<TEnum>().ToList<TEnum>();
foreach (TEnum item in list)
{
formattedNames.Add(GetEnumDescription(item as Enum));
}
return formattedNames;
}
}
В Use
public enum TestEnum
{
[Description("Something 1")]
Dr = 0,
[Description("Something 2")]
Mr = 1
}
static void Main(string[] args)
{
var vals = StaticClass.GetEnumFormattedNames<TestEnum>();
}
Это закончится возвратом "Что-то 1", "Что-то 2"
.