2012-08-05 8 views
3

열거 형을 사용하여 비트 마스크를 요일 목록으로 변환하는 메서드가 있습니다. 나는 그 반대로 노력하고 있지만 문제가 있습니다. 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 
} 

답변

2

은 추가 비트를 설정하는 |=하지 &=이어야한다.

문자열 표현을 함께 결합하여 그 결과를 Enum.Parse 메서드에 전달할 수 있습니다. 이것은 효율적이지는 않지만 코드는 더 짧아 보일 것입니다.

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

{M, Th, F} (link to ideone)에 대한 25 반환합니다.

+1

.NET 버전에 따라'.ToArray()'가 필요하지 않을 수도 있습니다. –

+0

@TimS. 사실입니다. 모노를 실행하는 ideone에서 컴파일되도록 ToArray()를 추가했습니다. – dasblinkenlight

관련 문제