C\#사용자 정의 문법 사탕 사용 에 대한 상세 한 설명

문법 사탕(Syntactic sugar)은 당의 문법 으로 도 번역 되 는데 영국 컴퓨터 과학자 피 터 존 란 다(Peter J.Landin)가 발명 한 용어 로 컴퓨터 언어 에 추 가 된 특정한 문법 을 말한다.이런 문법 은 언어의 기능 에 영향 을 주지 않 지만 프로그래머 가 사용 하기에 더욱 편리 하 다.일반적으로 문법 사탕 을 사용 하면 프로그램의 가 독성 을 증가 시 켜 프로그램 코드 오류 의 기 회 를 줄 일 수 있다.
If...Where 의 패키지-문법 사탕 WhereIf(독자 가 이미 알 고 있다 면 스스로 뛰 어 넘 으 세 요)
조건 조 회 를 할 때 우 리 는 이런 코드 를 자주 써 야 할 지도 모른다.

    List<User> Query(User queryModel)
    {
      //         
      List<User> userList = new List<User>
      {
        new User{ UserName = "   ", Phone = "10369852103", Role = "  " , Sex = true},
        new User{ UserName = "   ", Phone = "14785203630", Role = "  ",  Sex = true},
        new User{ UserName = "  ",  Phone = "14702021596", Role = "  ",  Sex = true},
        new User{ UserName = "  ",  Phone = "19469874106", Role = "  ",  Sex = false},
        new User{ UserName = "   ", Phone = "18502369740", Role = "  ",  Sex = true}
      };
      var data = userList.AsQueryable();//  IQueryable  

      //    
      if (!string.IsNullOrEmpty(queryModel.UserName))
      {
        data = data.Where(u => u.UserName == queryModel.UserName);
      }
      if (!string.IsNullOrEmpty(queryModel.Phone))
      {
        data = data.Where(u => u.Phone == queryModel.Phone);
      }
      if (!string.IsNullOrEmpty(queryModel.Role))
      {
        data = data.Where(u => u.Role == queryModel.Role);
      }
      if (queryModel.Sex != null)
      {
        data = data.Where(u => u.Sex == queryModel.Sex);
      }
      return data.ToList();
    }

들 어 오 는 인자 가 비어 있 지 않 을 때 만 조 회 를 실행 합 니 다.분명 한 것 은 여기 대량의 If-Where 문 구 는 매우 간단 하고 반복 되 는 코드(논리)로 포장 을 통 해 조작 을 간소화 하고 코드 를 간소화 할 수 있다.
일반적인 확장 방법 을 만 듭 니 다 WhereIf,코드 는 다음 과 같 습 니 다:

    public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> predicate)
    {
      return condition
        ? query.Where(predicate)
        : query;
    }
이 방법 은 If-Where 에 대한 패 키 징 을 실현 하 였 으 며,사용 방법 은 다음 과 같다.

    List<User> Query(User queryModel)
    {
      //         
      List<User> userList = new List<User>
      {
        new User{ UserName = "   ", Phone = "10369852103", Role = "  " , Sex = true},
        new User{ UserName = "   ", Phone = "14785203630", Role = "  ",  Sex = true},
        new User{ UserName = "  ",  Phone = "14702021596", Role = "  ",  Sex = true},
        new User{ UserName = "  ",  Phone = "19469874106", Role = "  ",  Sex = false},
        new User{ UserName = "   ", Phone = "18502369740", Role = "  ",  Sex = true}
      };

      var data = userList.AsQueryable()
        .WhereIf(!string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == queryModel.UserName)
        .WhereIf(!string.IsNullOrEmpty(queryModel.Phone), u => u.Phone == queryModel.Phone)
        .WhereIf(!string.IsNullOrEmpty(queryModel.Role), u => u.Role == queryModel.Role)
        .WhereIf(queryModel.Sex != null, u => u.Sex == queryModel.Sex);
      return data.ToList();
    }
이전에 8 줄 이 넘 는 코드 의 조회 코드 는 4 줄 로 간소화 되 었 고 코드 줄 수 는 절반 이 넘 게 줄 어 들 었 으 며 가 독성 이 크게 향상 되 었 다.간단 한 패키지 일 뿐 운행 효율 은 거의 변 하지 않 았 다.(대량의 코드 를 줄 이 고 가 독성 을 향상 시 키 며 기능 이 변 하지 않 고 효율 이 변 하지 않 으 며 장단 점 이 있 기 때문에 WhereIf 가 전통 적 인 If-Where 작업 을 대체 하 는 것 을 강력 히 권장 합 니 다.)
새로운 문제 가 발생 했 습 니 다.If 문 구 는 조건 이 만족 하지 않 는 상황 이 존재 합 니 다.else,WhereIf 방법 은 If Where 만 봉 인 했 지만 If-Wharre-else-where 문 구 를 봉 하지 않 았 습 니 다.다음 과 같은 조회 요 구 를 만나면 어떻게 해 야 합 니까?

      if (!string.IsNullOrEmpty(queryModel.UserName))
      {
        data = data.Where(u => u.UserName == queryModel.UserName);
      }
      else
      {
        data = data.Where(u => u.UserName == "   ");//        ,         
      }
이 문 제 를 해결 할 수 있 는 세 가지 방법 이 있다.
첫 번 째 방법 은 WhereIf 방법 을 수정 하고 else-Where 의 논 리 를 추가 하여 If-Wharre-else-where 의 논 리 를 지원 하 는 것 입 니 다.

public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> truePredicate, Expression<Func<T, bool>> falsePredicate = null)
      => condition ? query.Where(truePredicate) : falsePredicate == null ? query : query.Where(falsePredicate);
이러한 단점 도 뚜렷 하 다.매개 변수 condition 이 false 일 때 두 번 째 논리 적 판단 을 하 는데 단점 은 효율 을 낮 추 는 것 이 고 장점 은 코드 가 간결 하 다 는 것 이다.물론 논리 적 판단 이 하나 더 있어 도 효율 을 별로 낮 출 수 없다)
두 번 째 방법 은 두 번 째 논리 적 판단 을 피 하 는 방식 은 방법 을 다시 불 러 오 는 것 입 니 다.즉,whereif 방법 두 개 를 쓰 는 것 입 니 다.새로 추 가 된 이 whereif 방법 에서 매개 변수 falsePredicate 는 더 이상 빈 매개 변수 로 설정 하지 않 습 니 다.

public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> truePredicate, Expression<Func<T, bool>> falsePredicate)
      => condition ? query.Where(truePredicate) : query.Where(falsePredicate);
장점 은 효율 에 영향 을 주지 않 는 상황 에서 If-Wharre-else-where 논 리 를 지원 할 수 있다 는 것 이다.두 WhereIf 방법의 논 리 는 차이 가 많 지 않 고 간단 하고 중복 되 는 코드 를 써 서 간결 하지 않다 는 것 이 단점 이다.(물론 그것 을 정의 할 때 만 간결 하지 않 고 호출 할 때 간결 정도 와 방법 이 같 습 니 다)
세 번 째 방법 은 whereIf 방법 을 전혀 수정 하지 않 고 호출 할 때 만 매개 변수 condition 을 역 조작 하여 목적 을 달성 합 니 다.

var data2 = data.WhereIf(!string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == queryModel.UserName)
              .WhereIf(string.IsNullOrEmpty(queryModel.UserName), u => u.UserName == "   ");
장점:방법 정의 가 가장 간단 하고 단점:If-Whrere-else-where 논 리 를 만 났 을 때 코드 량 이 증가 합 니 다.
구체 적 으로 어떤 것 을 선택 할 지 는 독자 스스로 생각해 보 세 요.더 좋 은 실현 방법 이 있 으 면 댓 글로 토론 하고 공유 하 세 요^ ^
for 순환 패키지,문법 사탕 For
실제 개발 에 서 는 for 순환 에 대한 사용 이 하나의 조작,순환 이 지정 한 횟수 일 뿐 브레이크,contine 등 순환 을 미리 중지 하 는 논리 가 없다.이런 간단 하고 중복 되 는 논 리 는 추출 포장 을 할 수 있다.

    public static void For(int count, Action<int> action)
    {
      for (int i = 0; i < count; i++)
      {
        action.Invoke(i);
      }
    }
여기 서 C\#의 내장 형 위탁 Action 을 사 용 했 는데 그 역할 은 바로 방법 을 매개 변수 로 전달 하 는 것 이다.매개 변수 count 는 순환 총 횟수 를 나타 내 고 Action 의 매개 변수 int 는 진행 중인 순환 횟수 를 나타 낸다.0 부터 독 자 는 수요 에 따라 1 부터 시작 할 수 있다(여기 서 1 부터 시작 하 는 것 이 좋 은 지,0 부터 시작 하 는 것 이 좋 은 지,미 정).
호출:

SyntacticSugar.For(1, p => { int a = p + 8; data2.Remove(data2[a]); });
이렇게 호출 하 는 것 이 번거롭다 고 생각 되면 인자 count 에 this 를 추가 하여 확장 방법 으로 바 꾸 어 호출 을 간소화 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기