【问题标题】:Showing serial terms using the complex bit masks使用复杂位掩码显示串行项
【发布时间】:2019-05-24 07:58:30
【问题描述】:

我需要根据与这些天数相关的数字来制定一种显示连续术语的方法。

所以,我为每一天(学期)设定一个具体数字。

周日 = 1,周一 = 2,周二 = 4,周三 = 8,周四 = 16,周五 = 32,周六 = 64

如果用户选择了所有工作日,例如周一 - 周五 = 62, 或周末周六 - 周日 = 65。

我必须启动该方法以显示该学期中每周的那些日子。

在日历中显示术语的当前代码

        var terminDates = dataAccess.GetTerminDate(personal.LPE_Nr, date, DateTime.DaysInMonth(date.Year, date.Month));

        for (int i = 0; i < terminDates.Count; i++)
        {
            T_TERMINE _TERMINE = new T_TERMINE();
            List<T_TERMINE> terminList = dataAccess.GetListTermins(personal.LPE_Nr, terminDates[i]);
            string serId = null;
            foreach (var termin in terminList)
            {
                _TERMINE.TER_Betreff = termin.TER_Betreff;
                _TERMINE.TER_ID = termin.TER_ID;
                serId = termin.TER_TRS_ID;
            }
            List<T_TERMINSERIE> serieTermins = dataAccess.GetSerieTermins(serId);
            T_TERMINSERIE _TERMINSERIE = new T_TERMINSERIE();
            foreach (var ser_termin in serieTermins)
            {
                _TERMINSERIE.TRS_StartZeit = ser_termin.TRS_StartZeit;
                _TERMINSERIE.TRS_EndZeit = ser_termin.TRS_EndZeit;
                _TERMINSERIE.TRS_TagWoche = ser_termin.TRS_TagWoche; //(16)here I get the number of the bit of the mask
                _TERMINSERIE.TRS_StartDatum = ser_termin.TRS_StartDatum;
            }
           /* how now to include method to make that custom event appear 
            whenever the method renders, me now CustomEvent is only 
           displayed for the first time, how to include it and Event for each time the method finds that day in a single week?*/
           //FindNextDay()?
            CustomEvent ce = new CustomEvent() { IgnoreTimeComponent = true,
                Date = terminDates[i],
                EventText = _TERMINE.TER_Betreff,
                EventColor = Color.BlueViolet };
            if (!generatedEvents.Any(x => x.Date == ce.Date))
            {
                calendar1.AddEvent(ce);
                generatedEvents.Add(ce);
            }
        }

现在最重要的是基于我将从基数读取的数字的方法,我的意思是枚举中的数字。 每周重复此学期。

   [Flags]
        enum DaysBitMask { Sun = 1, Mon = 2, Tues = 4, Wed = 8, Thu = 16, Fri = 32, Sat = 64 }
        static DayOfWeek FindNextDay(DaysBitMask mask, DayOfWeek currentDay)
        {
            DayOfWeek dayCursor = currentDay;
            int counter = 0;
            do
            {
                int cursorMask = 0x01 << (int)dayCursor;
                int operationResult = (cursorMask & (int)mask);
                if (operationResult > 0)
                    return dayCursor;

                dayCursor = (DayOfWeek)(((int)dayCursor + 1) % 7);
                counter++;
            }
            while (counter < 7);

            throw new InvalidOperationException("Wrong flow. We shouldn't be here");
        }

这是我目前设计的代码,它不起作用,如果您可以更正我的方法“FindNextDay”并告诉我如何应用它以正确显示术语。谢谢大家的时间。

【问题讨论】:

  • FindNextDay方法有什么问题?
  • @RomanKoliada 对,我要在这一天找到一周
  • 我不太清楚FindNextDay 的用途;你能举出期望的输入和输出的例子吗?
  • @steve16351 我希望如果该术语设置为星期四 9.05,(daysBit 掩码(星期四 = 16)),我想在 16.05、23.05 重复它..
  • 抱歉,我还是不明白 - 你将 currentDay 传递为 DayOfWeek,但是你怎么能从中分辨出“下周四” - 它不应该是 @987654327 @?

标签: c#


【解决方案1】:

试试下面的代码

    [Flags]
    enum DaysBitMask { Sun = 1, Mon = 2, Tues = 4, Wed = 8, Thu = 16, Fri = 32, Sat = 64 }

    static DayOfWeek FindNextDay(DaysBitMask mask, DayOfWeek currentDay)
    {
        DayOfWeek dayCursor = currentDay;

        for (int counter = 0; counter < 7; counter++)
        {
            int cursorMask = 0x01 << (int)dayCursor;
            int operationResult = (cursorMask & (int)mask);
            if (operationResult > 0)
                return dayCursor;

            dayCursor = (DayOfWeek)(((int)dayCursor + 1) % 7);
        }

        throw new InvalidOperationException("We shouldn't be here");
    }

【讨论】:

  • 感谢您的帖子。然后如何为每个新事件显示此方法?我总是只从基础中获取 DaysBitMask 号码,我更改了我的代码。
  • @lasta,我不确定我是否遵循这个想法。我也没有在您使用 FindNextDay 方法的代码中看到任何情况。
  • 我的问题是方法本身的使用,因为我从数据库中获取这些天的值,这些值与 DaysBitMask 枚举中的值相同。这是我如何邀请此方法在每次找到新的一天时将术语设置为第一个的示例。
  • 那我不明白这个想法。您设计的方法是根据当前星期几和掩码(也包括星期几)来获取星期几。我看不出有什么理由应该使用这种方法来解决您的任务(即处理日期,而不是一周中的几天)。
  • 我更正了代码,我写在我需要的评论中
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多