때때로 다른 사람의 C # 코드를 읽을 때 단일 매개 변수에 여러 열거 형 값을 허용하는 메서드가 표시됩니다. 나는 항상 그것이 깔끔하다고 생각했지만 결코 들여다 보지 못했습니다.
글쎄, 이제 나는 그것을 필요로 할 수도 있지만 방법을 모르겠다.
- 이것을 받아들이도록 메소드 서명을 설정하십시오.
- 메서드의 값으로 작업
- 열거 형 정의
이런 일을 달성하기 위해.
내 특정 상황에서는 다음과 같이 정의 된 System.DayOfWeek를 사용하고 싶습니다.
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
하나 이상의 DayOfWeek 값을 메서드에 전달할 수 있기를 원합니다. 이 특정 열거 형을 그대로 사용할 수 있습니까? 위에 나열된 3 가지를 어떻게하나요?
답변
열거 형을 정의 할 때 [Flags]로 속성을 지정하고 값을 2의 거듭 제곱으로 설정하면 이러한 방식으로 작동합니다.
함수에 여러 값을 전달하는 것 외에 다른 변경 사항은 없습니다.
예를 들면 :
[Flags]
enum DaysOfWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
public void RunOnDays(DaysOfWeek days)
{
bool isTuesdaySet = (days & DaysOfWeek.Tuesday) == DaysOfWeek.Tuesday;
if (isTuesdaySet)
//...
// Do your work here..
}
public void CallMethodWithTuesdayAndThursday()
{
this.RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
}
자세한 내용 은 열거 형 유형에 대한 MSDN 설명서를 참조하십시오 .
질문 추가에 대한 응답으로 수정합니다.
배열 / 컬렉션 / 매개 변수 배열로 전달하는 것과 같은 작업을 원하지 않는 한 해당 열거 형을 그대로 사용할 수 없습니다. 그러면 여러 값을 전달할 수 있습니다. flags 구문에서는 Enum을 플래그로 지정해야합니다 (또는 설계되지 않은 방식으로 언어를 엉망으로 만들기 위해).
답변
더 우아한 해결책은 HasFlag ()를 사용하는 것입니다.
[Flags]
public enum DaysOfWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
public void RunOnDays(DaysOfWeek days)
{
bool isTuesdaySet = days.HasFlag(DaysOfWeek.Tuesday);
if (isTuesdaySet)
{
//...
}
}
public void CallMethodWithTuesdayAndThursday()
{
RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
}
답변
두 번째 리드의 대답입니다. 그러나 열거 형을 만들 때 일종의 비트 필드를 만들 수 있도록 각 열거 형 멤버에 대한 값을 지정해야합니다. 예를 들면 :
[Flags]
public enum DaysOfWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64,
None = 0,
All = Weekdays | Weekend,
Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
Weekend = Sunday | Saturday,
// etc.
}
답변
내 특정 상황에서는 System.DayOfWeek를 사용하고 싶습니다.
System.DayOfWeek를 [Flags]
제어 할 수 없기 때문에 열거 형 으로 사용할 수 없습니다 . 다중 DayOfWeek
을 받아들이는 방법을 원한다면 params
키워드 를 사용해야합니다.
void SetDays(params DayOfWeek[] daysToSet)
{
if (daysToSet == null || !daysToSet.Any())
throw new ArgumentNullException("daysToSet");
foreach (DayOfWeek day in daysToSet)
{
// if( day == DayOfWeek.Monday ) etc ....
}
}
SetDays( DayOfWeek.Monday, DayOfWeek.Sunday );
그렇지 않으면 [Flags]
수많은 다른 응답자에 의해 설명 된대로 고유 한 열거를 만들고 비트 비교를 사용할 수 있습니다.
답변
[Flags]
public enum DaysOfWeek
{
Mon = 1,
Tue = 2,
Wed = 4,
Thur = 8,
Fri = 16,
Sat = 32,
Sun = 64
}
숫자를 지정하고 비트 방식으로 값을 저장하기 때문에 이렇게 증가시켜야합니다.
그런 다음이 열거 형을 취하는 방법을 정의하십시오.
public void DoSomething(DaysOfWeek day)
{
...
}
그리고 그것을 호출하려면 다음과 같이하십시오.
DoSomething(DaysOfWeek.Mon | DaysOfWeek.Tue) // Both Monday and Tuesday
열거 형 값 중 하나가 포함되었는지 확인하려면 다음과 같은 비트 연산을 사용하여 확인하십시오.
public void DoSomething(DaysOfWeek day)
{
if ((day & DaysOfWeek.Mon) == DaysOfWeek.Mon) // Does a bitwise and then compares it to Mondays enum value
{
// Monday was passed in
}
}
답변
[Flags]
public enum DaysOfWeek{
Sunday = 1 << 0,
Monday = 1 << 1,
Tuesday = 1 << 2,
Wednesday = 1 << 3,
Thursday = 1 << 4,
Friday = 1 << 5,
Saturday = 1 << 6
}
이 형식으로 메서드 호출
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
EnumToArray 메서드를 구현하여 옵션 전달
private static void AddEntryToList(DaysOfWeek days, DaysOfWeek match, List<string> dayList, string entryText) {
if ((days& match) != 0) {
dayList.Add(entryText);
}
}
internal static string[] EnumToArray(DaysOfWeek days) {
List<string> verbList = new List<string>();
AddEntryToList(days, HttpVerbs.Sunday, dayList, "Sunday");
AddEntryToList(days, HttpVerbs.Monday , dayList, "Monday ");
...
return dayList.ToArray();
}
답변
[Flags] 속성으로 열거 형을 표시하십시오. 또한 모든 값이 1,2,4,8,16,32,64와 같이 상호 배타적인지 확인하십시오 (두 값이 서로 같을 수 없음).
[Flags]
public enum DayOfWeek
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
DayOfWeek 열거 형을 허용하는 메서드가있는 경우 비트 또는 연산자 (|)를 사용하여 여러 멤버를 함께 사용합니다. 예를 들면 :
MyMethod(DayOfWeek.Sunday|DayOfWeek.Tuesday|DayOfWeek.Friday)
매개 변수에 특정 멤버가 포함되어 있는지 확인하려면 확인중인 멤버에 비트 및 연산자 (&)를 사용하십시오.
if(arg & DayOfWeek.Sunday == DayOfWeek.Sunday)
Console.WriteLine("Contains Sunday");
