Как Вы передаете несколько перечислимых значений в C#?

URL url = new URL("http://host/theimage.jpg");
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();

Этого достаточно, чтобы начать тебя? Не знаю, что ты хочешь делать оттуда.

111
задан Ronnie Overby 23 June 2009 в 01:20
поделиться

9 ответов

Когда вы определяете перечисление, просто присвойте ему атрибут [Flags], установите значения в степени двойки, и это будет работать следующим образом.

Ничего другого не изменится, кроме передачи нескольких значений в функцию.

Например:

[Flags]
enum DaysOfWeek
{
   Sunday = 1,
   Monday = 2,
   Tuesday = 4,
   Wednesday = 8,
   Thursday = 16,
   Friday = 32,
   Saturday = 64
}

public void RunOnDays(DaysOfWeek days)
{
   bool isTuesdaySet = (days & DaysOfWeek.Tuesday) == DaysOfWeek.Tuesday;

   if (isTuesdaySet)
      //...
   // Do your work here..
}

public void CallMethodWithTuesdayAndThursday()
{
    this.RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
}

Для получения дополнительных сведений см. документацию MSDN по типам перечисления .


Редактировать в ответ на дополнения к вопросу.

Вы не сможете использовать это перечисление как есть, если только вы не хотите передать его как массив array / collection / params. Это позволит вам передать несколько значений. Синтаксис flags требует, чтобы Enum был указан как flags (или чтобы изменить язык не предназначенным для него способом).

173
ответ дан 24 November 2019 в 02:58
поделиться

В моей конкретной ситуации я бы нравится использовать System.DayOfWeek

. System.DayOfWeek нельзя использовать в качестве перечисления [Flags] , потому что вы не можете его контролировать. Если вы хотите иметь метод, который принимает несколько DayOfWeek , вам нужно будет использовать ключевое слово params

void SetDays(params DayOfWeek[] daysToSet)
{
    if (daysToSet == null || !daysToSet.Any())
        throw new ArgumentNullException("daysToSet");

    foreach (DayOfWeek day in daysToSet)
    {
        // if( day == DayOfWeek.Monday ) etc ....
    }
}

SetDays( DayOfWeek.Monday, DayOfWeek.Sunday );

В противном случае вы можете создать свои собственные [Flags] перечисление, как указано многими другими респондентами, и использование побитовых сравнений.

11
ответ дан 24 November 2019 в 02:58
поделиться

Я второй ответ Рида. Однако при создании перечисления вы должны указать значения для каждого члена перечисления, чтобы получилось своего рода битовое поле. Например:

[Flags]
public enum DaysOfWeek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,

    None = 0,
    All = Weekdays | Weekend,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
    Weekend = Sunday | Saturday,
    // etc.
}
23
ответ дан 24 November 2019 в 02:58
поделиться
[Flags]
public enum DaysOfWeek
{
  Mon = 1,
  Tue = 2,
  Wed = 4,
  Thur = 8,
  Fri = 16,
  Sat = 32,
  Sun = 64
}

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

Затем просто определите ваш метод, чтобы взять это перечисление

public void DoSomething(DaysOfWeek day)
{
  ...
}

и вызвать его, сделайте что-то вроде

DoSomething(DaysOfWeek.Mon | DaysOfWeek.Tue) // Both Monday and Tuesday

. Чтобы проверить, было ли включено одно из значений перечисления, проверьте их, используя поразрядные операции, такие как

public void DoSomething(DaysOfWeek day)
{
  if ((day & DaysOfWeek.Mon) == DaysOfWeek.Mon) // Does a bitwise and then compares it to Mondays enum value
  {
    // Monday was passed in
  }
}
9
ответ дан 24 November 2019 в 02:58
поделиться
[Flags]
    public enum DaysOfWeek{


        Sunday = 1 << 0,
        Monday = 1 << 1,
        Tuesday = 1 << 2,
        Wednesday = 1 << 3,
        Thursday = 1 << 4,
        Friday =  1 << 5,
        Saturday =  1 << 6
    }

вызов метода в этом формате

MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);

Реализовать метод EnumToArray для получения переданных параметров

private static void AddEntryToList(DaysOfWeek days, DaysOfWeek match, List<string> dayList, string entryText) {
            if ((days& match) != 0) {
                dayList.Add(entryText);
            }
        }

        internal static string[] EnumToArray(DaysOfWeek days) {
            List<string> verbList = new List<string>();

            AddEntryToList(days, HttpVerbs.Sunday, dayList, "Sunday");
            AddEntryToList(days, HttpVerbs.Monday , dayList, "Monday ");
            ...

            return dayList.ToArray();
        }
3
ответ дан 24 November 2019 в 02:58
поделиться

Что-то вроде этого должно показать, что вы ищете:

[Flags]
public enum SomeName
{
    Name1,
    Name2
}

public class SomeClass()
{
    public void SomeMethod(SomeName enumInput)
    {
        ...
    }
}
-3
ответ дан 24 November 2019 в 02:58
поделиться

С помощью опубликованных ответов и следующих:

  1. FlagsAttribute Class (Посмотрите сравнение использования и неиспользования атрибута [Flags])
  2. Enum Flags Attribute

Кажется, я хорошо это понимаю.

Спасибо.

0
ответ дан 24 November 2019 в 02:58
поделиться

Пометьте перечисление атрибутом [Flags]. Также убедитесь, что все ваши значения являются взаимоисключающими (два значения не могут в сумме равняться другому), например 1,2,4,8,16,32,64 в вашем случае

[Flags]
public enum DayOfWeek
{ 
Sunday = 1,   
Monday = 2,   
Tuesday = 4,   
Wednesday = 8,   
Thursday = 16,   
Friday = 32,    
Saturday = 64
}

Когда у вас есть метод, который принимает В перечислении DayOfWeek используется побитовый оператор или (|) для одновременного использования нескольких членов. Например:

MyMethod(DayOfWeek.Sunday|DayOfWeek.Tuesday|DayOfWeek.Friday)

Чтобы проверить, содержит ли параметр определенный член, используйте побитовые операторы и (&) с элементом, который вы проверяете.

if(arg & DayOfWeek.Sunday == DayOfWeek.Sunday)
Console.WriteLine("Contains Sunday");
3
ответ дан 24 November 2019 в 02:58
поделиться

Рид Копси прав, и я бы добавил к исходному сообщению, если бы мог, но я не могу, поэтому мне придется ответить вместо этого.

Опасно просто использовать [Flags] в любом старом перечислении. Я считаю, что вам нужно явно изменить значения перечисления на степени двойки при использовании флагов, чтобы избежать конфликтов в значениях. См. Рекомендации для FlagsAttribute и Enum .

2
ответ дан 24 November 2019 в 02:58
поделиться
Другие вопросы по тегам:

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