[씨#] 복잡한 If 문 단순화
약간의 수학으로 이것을 단순화 할 수 있습니다.
int on = (level+1)/2;
for (int i = 0 ; i != 8 ; i++) {
_items[i].Enabled = (i < on);
}
첫 번째 줄은 1에서 16 (포함) 범위의 숫자를 1에서 8 (포함) 범위의 숫자로 변환합니다. 그런 다음 루프는 모든 항목을 통과하고 on
이전에 계산 된 변수 값으로 표시된만큼 많은 항목을 활성화합니다 .
당신은 성능을 잃을 수도 있지만 틀림없이 더 읽기 쉽습니다. 독을 선택하십시오! 성능 차이는 호출 빈도에 따라 다릅니다.
if(level >= 1) {
_items[0].Enabled = level >= 1;
_items[1].Enabled = level >= 3;
_items[2].Enabled = level >= 5;
_items[3].Enabled = level >= 8;
_items[4].Enabled = level >= 9;
_items[5].Enabled = level >= 11;
_items[6].Enabled = level >= 13;
_items[7].Enabled = level >= 15;
}
-------------------한 가지 옵션은 a Dictionary
를 사용하여 각 확인란 인덱스의 범위를 저장할 수 있습니다 .
private static Dictionary<int, Tuple<int, int>> _Ranges = new Dictionary<int, Tuple<int, int>>()
{
{ 0, Tuple.Create(1, 3) },{ 1, Tuple.Create(3, 5) },{ 2, Tuple.Create(5, 7) },{ 3, Tuple.Create(7, 9) },
{ 4, Tuple.Create(9, 11) },{ 5, Tuple.Create(11, 13) },{ 6, Tuple.Create(13, 15) },{ 7, Tuple.Create(15, 17) }
};
이제이 간결한 코드는 동일한 작업을 수행해야합니다.
for(int i = 0; i <= 7; i++)
{
var range = _Ranges[i];
_items[i].Enabled = level >= range.Item1 && level < range.Item2;
}
Range
이 논리를 캡슐화 하는 사용자 정의 클래스를 만들 수도 있습니다 .
대신 다음과 같이 바꾸십시오.
_items[0].Enabled = ( level >= 1 && level < 17 );
....
-------------------다른 항목을 제거하십시오.
_items[0].Enabled = false;
_items[1].Enabled = false;
_items[2].Enabled = false;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
if (level >= 1)
_items[0].Enabled = true;
if (level >= 3)
_items[1].Enabled = true;
if (level >= 5)
_items[2].Enabled = true;
if (level >= 7)
_items[3].Enabled = true;
if (level >= 9)
_items[4].Enabled = true;
if (level >= 11)
_items[5].Enabled = true;
if (level >= 13)
_items[6].Enabled = true;
if (level >= 15 && level < 17)
_items[7].Enabled = true;
-------------------보안 수준이 완벽하게 겹치는 것 같습니다.
그래서 당신은 간단한 일을 할 수 없습니까?
_items[0].Enabled = (level >= 1);
_items[1].Enabled = (level >= 3);
_items[2].Enabled = (level >= 5);
기타?
-------------------양식 구성 요소를 활성화 / 비활성화하는이 방법은 처음부터 결함이 있다고 제안하는 경향이 있습니다. 그리고 최상위 답변은 양식의 항목이 순서가 지정되고 권한 수준과 함께 1 대 N에 해당하는이 좁은 경우 만 해결합니다.
이 응용 프로그램이 모든 종류의 프레젠테이션 분리 시나리오 (MVC, MVVM 등)를 사용하는 경우 데이터 바인딩을 통해 확실히 다르게 수행해야합니다.
그러나 가장 순진한 경우에도이를 처리하는 더 좋은 방법은 확인란에 권한 수준 플래그를 추가하고 (WinForms의 태그, WPF의 연결된 속성 등을 사용하는 등) 현재와 비교하여 반복하는 것입니다. 사용자의 권한. 권한 수준에 대한 확인란 사전도 잘 작동합니다.
Dictionary<Control, int> RequiredControlPrivilege;
foreach(var item in _items)
{
if(RequiredControlPrivilege.Contains(item)
{
item.Enabled = RequiredControlPrivilege[item] >= CurrentLevel
}
else
{
item.Enabled = false //Default to false or change to true...
}
}
출처
https://stackoverflow.com/questions/22079972