카테고리 없음

[씨#] 복잡한 If 문 단순화

행복을전해요 2021. 2. 21. 13:37

약간의 수학으로 이것을 단순화 할 수 있습니다.

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