2

«Множества» в С#

Андрей Трусов
23 октября 2009 года

Снова пишу про то, что, в общем-то, известно =) Но если где-то нужно передать в качестве аргумента функции несколько флагов, то данный способ можно использовать. Множеств в C# нет. Но зато есть атрибут [FlagsAttribute] для перечислений (т.е. для enum'ов):

[FlagsAttribute]
enum Magic
{
  None = 0,

  Fire = 1, //огонь
  Air  = 2, //воздух
  Water = 4, //вода
  Earth = 8, //земля

  All  = Fire | Air | Water | Earth
}

* This source code was highlighted with Source Code Highlighter.

Просто приведу пример:

class Program
{
  //перечисление
  [FlagsAttribute]
  enum Magic
  {
    None = 0,

    Fire = 1, //огонь
    Air  = 2, //воздух
    Water = 4, //вода
    Earth = 8, //земля

    All  = Fire | Air | Water | Earth
  }

  //пример функции, работающей с перечислением
  static void CastSpell(float power, Magic source)
  {
    if ((source & Magic.All) == Magic.None)
    {
      Console.WriteLine("Неизвестная школа магии.");
      Console.WriteLine();
      return;
    }

    if ((source & Magic.Fire) != 0)
      Console.WriteLine("Школа огня.");
    if ((source & Magic.Air) != 0)
      Console.WriteLine("Школа воздуха.");
    if ((source & Magic.Water) != 0)
      Console.WriteLine("Школа воды.");
    if ((source & Magic.Earth) != 0)
      Console.WriteLine("Школа земли.");

    Console.WriteLine("РЕКС-ПЭКС-ФЭКС!!! (произнесено заклинание силой {0} едениц).", power);
    Console.WriteLine();
  }

  //пример использования
  static void Main(string[] args)
  {
    CastSpell(1, 0);
    CastSpell(2, Magic.None);
    CastSpell(3, Magic.Fire);
    CastSpell(4, Magic.Earth | Magic.Water);
    CastSpell(5, Magic.Air | Magic.Fire | Magic.Earth);
    CastSpell(6, Magic.All);
  }
}

* This source code was highlighted with Source Code Highlighter.

Это, конечно, не настоящее множество, со своими костылями, но пользоваться им можно. Главное не забывать про то, что элементы множества должны быть степенями двойки и помнить как работают битовые операции. Ну еще стоит почитать в MSDN про "FlagsAttribute Class".

Метки: ,

2 комментария к записи ««Множества» в С#»

  1. Trurl,

    На первый взгляд кажется, что код будет работать и без атрибута FlagsAttribute. Потом понял, что комбинации значений не будут приводиться к типу Magic. Еще выигрыш от этого, что такие значения можно приводить к строке.

  2. speller,

    Слово "ед[b]и[/b]ница" пишется так

Оставить комментарий