C\#사용자 정의 문법 사탕 사용 에 대한 상세 한 설명
7186 단어 C#사용자 정의 문법 사탕
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 를 추가 하여 확장 방법 으로 바 꾸 어 호출 을 간소화 할 수 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.