Используя перечисление как индекс массива в C#

Файл cookie только для хоста означает, что файл cookie должен обрабатываться браузером только на сервере на том же хосте / сервере, который первым отправил его в браузер.

Вы не хотите отправлять cookie этого хоста только для рекламных кампаний, поскольку они могут содержать конфиденциальную информацию.

27
задан Community 23 May 2017 в 12:17
поделиться

4 ответа

Если значения элементов перечисления совпадают, метод массива работает довольно хорошо. Однако в любом случае вы можете использовать Dictionary (который, кстати, менее эффективен).

18
ответ дан 28 November 2019 в 05:32
поделиться

Вы могли бы создать класс или структуру, которые могли бы выполнять эту работу за вас


public class Caster
{
    public enum DayOfWeek
    {
        Sunday = 0,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    }

    public Caster() {}
    public Caster(string[] data) { this.Data = data; }

    public string this[DayOfWeek dow]{
        get { return this.Data[(int)dow]; }
    }

    public string[] Data { get; set; }


    public static implicit operator string[](Caster caster) { return caster.Data; }
    public static implicit operator Caster(string[] data) { return new Caster(data); }

}

class Program
{
    static void Main(string[] args)
    {
        Caster message_array = new string[7];
        Console.Write(message_array[Caster.DayOfWeek.Sunday]);
    }
}

РЕДАКТИРОВАТЬ

Из-за отсутствия лучшего места для размещения этого, я публикую общую версию класса Caster ниже. К сожалению, он полагается на проверки во время выполнения для принудительного использования TKey в качестве перечисления.

public enum DayOfWeek
{
    Weekend,
    Sunday = 0,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

public class TypeNotSupportedException : ApplicationException
{
    public TypeNotSupportedException(Type type)
        : base(string.Format("The type \"{0}\" is not supported in this context.", type.Name))
    {
    }
}

public class CannotBeIndexerException : ApplicationException
{
    public CannotBeIndexerException(Type enumUnderlyingType, Type indexerType)
        : base(
            string.Format("The base type of the enum (\"{0}\") cannot be safely cast to \"{1}\".",
                          enumUnderlyingType.Name, indexerType)
            )
    {
    }
}

public class Caster<TKey, TValue>
{
    private readonly Type baseEnumType;

    public Caster()
    {
        baseEnumType = typeof(TKey);
        if (!baseEnumType.IsEnum)
            throw new TypeNotSupportedException(baseEnumType);
    }

    public Caster(TValue[] data)
        : this()
    {
        Data = data;
    }

    public TValue this[TKey key]
    {
        get
        {
            var enumUnderlyingType = Enum.GetUnderlyingType(baseEnumType);
            var intType = typeof(int);
            if (!enumUnderlyingType.IsAssignableFrom(intType))
                throw new CannotBeIndexerException(enumUnderlyingType, intType);
            var index = (int) Enum.Parse(baseEnumType, key.ToString());
            return Data[index];
        }
    }

    public TValue[] Data { get; set; }


    public static implicit operator TValue[](Caster<TKey, TValue> caster)
    {
        return caster.Data;
    }

    public static implicit operator Caster<TKey, TValue>(TValue[] data)
    {
        return new Caster<TKey, TValue>(data);
    }
}

// declaring and using it.
Caster<DayOfWeek, string> messageArray =
    new[]
        {
            "Sunday",
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday",
            "Saturday"
        };
Console.WriteLine(messageArray[DayOfWeek.Sunday]);
Console.WriteLine(messageArray[DayOfWeek.Monday]);
Console.WriteLine(messageArray[DayOfWeek.Tuesday]);
Console.WriteLine(messageArray[DayOfWeek.Wednesday]);
Console.WriteLine(messageArray[DayOfWeek.Thursday]);
Console.WriteLine(messageArray[DayOfWeek.Friday]);
Console.WriteLine(messageArray[DayOfWeek.Saturday]);
7
ответ дан 28 November 2019 в 05:32
поделиться

Вот так:

string[] message_array = Enum.GetNames(typeof(DaysOfTheWeek));

Если вам действительно нужна длина, тогда просто возьмите .Length в результате :) Вы можете получить значения с помощью:

string[] message_array = Enum.GetValues(typeof(DaysOfTheWeek));
4
ответ дан 28 November 2019 в 05:32
поделиться

Вы всегда можете выполнить дополнительное сопоставление, чтобы получить индекс массива значения перечисления согласованным и определенным способом:

int ArrayIndexFromDaysOfTheWeekEnum(DaysOfWeek day)
{
   switch (day)
   {
     case DaysOfWeek.Sunday: return 0;
     case DaysOfWeek.Monday: return 1;
     ...
     default: throw ...;
   }
}

Будьте как можно более конкретными. Однажды кто-то изменит ваше перечисление, и код выйдет из строя, потому что значение перечисления (неправильно) использовалось в качестве индекса массива.

0
ответ дан 28 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

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