Итерация C# через перечисление? (Индексация Системы. Массив)

Если вы обрабатываете большой объем данных (много мегабайт), вы хотите использовать XmlReader для потоковой обработки XML-файла.

Что-нибудь еще (XPathNavigator, XElement, XmlDocument и даже XmlSerializer, если вы сохраняете полный график объектов) приведет к использованию большой памяти , а также к очень медленному времени загрузки.

Конечно, если вы все равно нужны все данные в памяти, тогда у вас может не быть выбора.

109
задан Serhat Ozgel 27 January 2009 в 09:13
поделиться

8 ответов

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 возвращает имена?

196
ответ дан Anders 5 November 2019 в 10:11
поделиться

Массив имеет GetValue (Int32) метод, который можно использовать для получения значения в указанном индексе.

Массив. GetValue

2
ответ дан Bubblewrap 5 November 2019 в 10:11
поделиться

Что относительно того, чтобы использовать цикл foreach, возможно, Вы могли работать с этим?

  int i = 0;
  foreach (var o in values)
  {
    print(names[i], o);
    i++;
  }

что-то как этот, возможно?

3
ответ дан TWith2Sugars 5 November 2019 в 10:11
поделиться

Необходимо бросить массив - возвращенный массив на самом деле имеет требуемый тип, т.е. myEnum[], если Вы просите typeof(myEnum):

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));

Затем values[0] и т.д.

32
ответ дан Marc Gravell 5 November 2019 в 10:11
поделиться

Как насчет списка словаря?

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));
}

и конечно можно изменить тип значения словаря на то, что перечислимые значения.

7
ответ дан mrtaikandi 5 November 2019 в 10:11
поделиться

Можно бросить тот Массив к различным типам Массивов:

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));

или если Вы хотите целочисленные значения:

int[] values = (int[])Enum.GetValues(typeof(myEnum));

можно выполнить итерации тех литых массивов, конечно, :)

9
ответ дан Arcturus 5 November 2019 в 10:11
поделиться

Вот простой способ перебрать ваш пользовательский объект Enum

For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum))

     Print([Enum].GetName(GetType(MyEnum), enumValue).ToString)

Next
0
ответ дан 24 November 2019 в 03:20
поделиться

Вот еще один. У нас была необходимость предоставить дружественные имена для наших 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"

.
4
ответ дан 24 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: