【问题标题】:How do I separate an enum type?如何分离枚举类型?
【发布时间】:2020-12-04 13:32:59
【问题描述】:

我列出了以下类型:

using System;

namespace Music
{
 [Flags]
    public enum Days
    {
        None = 0,
        Mon = 1,
        Tue = 2,
        Wed = 4,
        Thu = 8,
        Fri = 16,
        Sat = 32,
        Sun = 64

    }
 }

我希望你,以 Days 的两个变量为例:

Days myDays1 = Days.Mon | Days.Thu | Days.Fri | Days.Sat;
Days myDays2 = Days.Mon | Days.Tue | Days.Sat;

使用myDays1 & myDays2 我想获得匹配的日期,但要分开检查,这样我就可以检查其他内容,也就是说,我想在一侧使用Days.Mon,在另一侧使用Days.Sat。我该怎么做?

【问题讨论】:

  • 恐怕我没有听懂你的问题。 “一方面”和“另一方面”是什么意思?
  • 我想在一个变量中获取 myDays1 和 myDays2,然后经历所有的巧合。 @canton7
  • 您已经知道如何在变量中获取myDays1 & myDays2Days result = myDays1 & myDays2。如果要列出在result 中选择了哪些日期,请参阅@SomeBody 的答案:每天循环,查看是否在result 中设置

标签: c# enums


【解决方案1】:

您可以使用 Linq 相当轻松地做到这一点。鉴于您现有的 myDays1myDays2 声明:

var overlap = Enum.GetValues<Days>().Where(day => (myDays1 & myDays2 & day) != 0);

foreach (var day in overlap)
{
    ... Do something with 'day', which is of type 'Days' (Mon and Sat for your example)

【讨论】:

  • @JuanDomínguez 您使用的是什么版本的 .Net/C#? GetValues&lt;TEnum&gt;() 需要 .Net 5..0 或更高版本。
【解决方案2】:

您可以使用此扩展方法来分隔日期:

public static IEnumerable<Days> GetSingleDays(this Days input)
        {
            return ((Days[])Enum.GetValues(typeof(Days))).Where(x => x != Days.None && input.HasFlag(x));
        }

如果你写

Days myDays1 = Days.Mon | Days.Thu | Days.Fri | Days.Sat;
Days myDays2 = Days.Mon | Days.Tue | Days.Sat;
Days and = myDays1 & myDays2;
Days[] single = and.GetSingleDays().ToArray();

你会得到一个包含 Days.Mon 和 Day.Sat 的数组;

【讨论】:

    【解决方案3】:

    除非我误解了你,你想要两个变量之间的所有匹配,同时仍然能够确定哪些日期匹配?由于您的标志枚举基本上是一个位掩码,因此您可以使用按位 AND 来获得一个包含所有匹配项的新枚举。

    Days myDays1 = Days.Mon | Days.Thu | Days.Fri | Days.Sat;
    Days myDays2 = Days.Mon | Days.Tue | Days.Sat;
    var matches = myDays1 & myDays2;
    // matches.Mon == True, matches.Sat == True
    // matches > 0 == True
    

    【讨论】:

      【解决方案4】:

      尝试以下:

                  Days myDay = Days.Sat;
      
                  Days myDays1 = Days.Mon | Days.Thu | Days.Fri | Days.Sat;
                  Days myDays2 = Days.Mon | Days.Tue | Days.Sat;
      
                  if (((int)myDays2 & (int)myDay) != 0)
                  {
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 2012-09-16
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多