Как сравнить стандартный DayOfWeek с собственным флагом - PullRequest
1 голос
/ 23 июня 2019

У меня есть свой собственный список флагов DaysOfWeek (вид https://docs.microsoft.com/en-us/previous-versions/ms886541(v=msdn.10))

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

И мне нужно сравнить стандартный DayOfWeek с моим. Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 23 июня 2019

Поскольку в вашем перечислении используется тот же порядок дней, что и во встроенном DayOfWeek, все, что вам нужно сделать, это использовать переменную типа DayOfWeek в качестве показателя степени 2, а затем поразрядно - И это сваша переменная перечисления.

Примерно так (это проверит, если Monday флаг вашего перечисления 1 или нет):

MyDayOfWeek Days = MyDayOfWeek.Monday | MyDayOfWeek.Friday;
DayOfWeek D = DayOfWeek.Monday;
var Mask = 1 << (int)D;

if ((Mask & (int)Days) == Mask)
  //Do whatever;

Я переименовал ваше перечисление в MyDaysOfWeek, тогда как DayOfWeek - это встроенный тип .NET.Вы можете сделать то же самое для любого дня недели.

Редактировать

Как отметил @HenkHolterman (спасибо за это), у вас будут проблемы с вашим Sunday, установленным на 0,Enum Flags обычно должен начинаться с члена с именем None, равного 0 и указывающего на то, что ни один из флагов переменной не установлен.

0 голосов
/ 23 июня 2019

Если вы измените свой Enum следующим образом:

[Flags]
public enum DayOfWeek
{
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6
}

Вы можете попробовать это:

class Program
{
    public static bool Equal(DayOfWeek mine, System.DayOfWeek cSharp)
    {
        int mineInt = (int)mine;
        int cSharpInt = (int)cSharp;
        return mineInt == cSharpInt;
    }

    static void Main(string[] args)
    {

        DateTime dateTime = DateTime.Now;
        DayOfWeek dayOfWeek = DayOfWeek.Sunday;

        bool areEqual = Equal(dayOfWeek, dateTime.DayOfWeek);
        Console.WriteLine(areEqual);
        Console.ReadKey();
    }
}

Если вы не можете изменить свой Enum, вы можете попробовать это:

class Program
{
    public static bool Equal(DayOfWeek mine, System.DayOfWeek cSharp)
    {
        if (mine == DayOfWeek.Friday && cSharp == System.DayOfWeek.Friday       || 
            mine == DayOfWeek.Monday && cSharp == System.DayOfWeek.Monday       || 
            mine == DayOfWeek.Saturday && cSharp == System.DayOfWeek.Saturday   || 
            mine == DayOfWeek.Sunday && cSharp == System.DayOfWeek.Sunday       || 
            mine == DayOfWeek.Thursday && cSharp == System.DayOfWeek.Thursday   ||
            mine == DayOfWeek.Tuesday && cSharp == System.DayOfWeek.Tuesday     || 
            mine == DayOfWeek.Wednesday && cSharp == System.DayOfWeek.Wednesday)
            return true;

        return false;
    }

    static void Main(string[] args)
    {

        DateTime dateTime = DateTime.Now;
        DayOfWeek dayOfWeek = DayOfWeek.Tuesday;

        bool areEqual = Equal(dayOfWeek, dateTime.DayOfWeek);
        Console.WriteLine(areEqual);
        Console.ReadKey();
    }
}
0 голосов
/ 23 июня 2019

Спасибо всем за помощь.Наконец, у меня есть решение

Собственных DaysOfWeek с флагом:

[Flags]
public enum DaysOfWeek
{
    None = 0,
    Sunday = 1 << 0,
    Monday = 1 << 1,
    Tuesday = 1 << 2,
    Wednesday = 1 << 3,
    Thursday = 1 << 4,
    Friday = 1 << 5,
    Saturday = 1 << 6,
}

Поскольку собственный enum имеет тот же порядок дней, мы можем написать метод расширения для преобразования стандартного DayOfWeek в собственный

public static class EnumExtensions
{
    public static DaysOfWeek ToFlag(this DayOfWeek dayOfWeek)
    {
        var mask = 1 << (int)dayOfWeek;
        return (DaysOfWeek)Enum.ToObject(typeof(DaysOfWeek), mask);
    }
}

И использование:

  var days = DaysOfWeek.Sunday | DaysOfWeek.Friday;
  var day = DayOfWeek.Sunday;
  var ownDay = day.ToFlag();
  if (days.HasFlag(ownDay))
      // Do whatever;

Детская площадка: https://dotnetfiddle.net/sV3yge

...