C# 如何将一周中的这几天转换为位掩码?

C# 如何将一周中的这几天转换为位掩码?,c#,.net,c#-4.0,bit-manipulation,bitmask,C#,.net,C# 4.0,Bit Manipulation,Bitmask,我有一个方法,可以使用枚举将位掩码转换为天数列表。我正试图做相反的事情,但遇到了麻烦。我有DaysOfWeekToEnum工作,但没有DaysOfWeekFromEnum。下面是我想做的。有人能帮忙吗 public static short DaysOfWeekFromEnum(IEnumerable<DaysInWeekIds> daysOfWeek) { short mask; foreach (var item in daysOfWeek) {

我有一个方法,可以使用枚举将位掩码转换为天数列表。我正试图做相反的事情,但遇到了麻烦。我有
DaysOfWeekToEnum
工作,但没有
DaysOfWeekFromEnum
。下面是我想做的。有人能帮忙吗

public static short DaysOfWeekFromEnum(IEnumerable<DaysInWeekIds> daysOfWeek)
{
    short mask;

    foreach (var item in daysOfWeek)
    {
        mask &= item; // ????
    }

    return mask
}

public static IEnumerable<DaysInWeekIds> DaysOfWeekToEnum(short mask)
{
    var values = new List<DaysInWeekIds>();

    foreach (short enumValue in Enum.GetValues(typeof(DaysInWeekIds)))
    {
        if (mask & enumValue == enumValue)
        {
            values.Add((DaysInWeekIds) Enum.ToObject(typeof(DaysInWeekIds),
                enumValue));
        }
    }

    return values;
}

/// <summary> The days in week ids. </summary>
public enum DaysInWeekIds : short
{
    M = 1,
    Tu = 2,
    W = 4,
    Th = 8,
    F = 16,
    Sa = 32,
    Su = 64
}
public static short DaysOfWeekFromEnum(IEnumerable daysOfWeek)
{
短面罩;
foreach(var项目,以daysOfWeek为单位)
{
遮罩&=项目;//????
}
返回掩码
}
公共静态IEnumerable DaysOfWeekToEnum(短掩码)
{
var值=新列表();
foreach(Enum.GetValues中的短枚举值(typeof(DaysInWeekIds)))
{
if(掩码和枚举值==枚举值)
{
values.Add((DaysInWeekIds)Enum.ToObject(typeof(DaysInWeekIds),
枚举值);
}
}
返回值;
}
///一周中的天数ID。
两周内的公共枚举日:短
{
M=1,
Tu=2,
W=4,
Th=8,
F=16,
Sa=32,
Su=64
}

设置附加位时,应该是
|=
,而不是
&=

您还可以将字符串表示连接在一起,并将结果传递给
Enum.Parse
方法。这没有那么有效,但代码看起来会更短

var res = (DaysInWeekIds)Enum.Parse(
    typeof(DaysInWeekIds)
,   string.Join(",", daysOfWeek.Select(d => d.ToString()).ToArray())
);

这将为
{M,Th,F}
()返回
25

根据您的.NET版本,可能不需要
.ToArray()
。@TimS。这是真的——我添加了
ToArray()
,使其在运行mono的ideone上编译。