2012-06-18 2 views
1

나는이 코드를 List를 입력 매개 변수 중 하나로 사용하는 일반적인 메서드를 사용합니다. 메서드 내에서 공통 LINQ 호출로 실행되는 IF/ELSEIF 문입니다. LINQ가 모든 IF/ELSEIF에 공통으로 적용될 수 있도록 도와주세요.제네릭과 IList 관련

private Boolean filterList<T>(List<T> anyOutdoorSports, int numberOfPartcipants) 
{ 
    if (anyOutdoorSports == null){ return false ;} 
    Boolean _returnValue = false; 

    if (anyOutdoorSports.GetType() == typeof(List<Swimming>)) 
    { 
     List<Swimming> Swimming = anyOutdoorSports.Cast<Swimming>().ToList(); 

     if (Swimming.Count > 0) 
     { 
      int listCount = (from rca in Swimming 
          where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina") 
          select rca).Count(); 
      _returnValue = listCount > 0 ? true : false; 
     } 
    } 
    else if (anyOutdoorSports.GetType() == typeof(List<Tennis>)) 
    { 
     List<Tennis> Tennis = anyOutdoorSports.Cast<Tennis>().ToList(); 

     if (Tennis.Count > 0) 
     { 
      int listCount = (from rca in Tennis 
          where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina") 
          select rca).Count(); 
      _returnValue = listCount > 0 ? true : false; 
     } 
    } 
    else if (anyOutdoorSports.GetType() == typeof(List<Soccer>)) 
    { 
     List<Soccer> Soccer = anyOutdoorSports.Cast<Soccer>().ToList(); 

     if (Soccer.Count > 0) 
     { 
      int listCount = (from rca in Soccer 
          where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina") 
          select rca).Count(); 
      _returnValue = listCount > 0 ? true : false; 
     } 
    } 

    return _returnValue; 
} 

누구든지 열람하거나 참조한 사람에게 감사합니다.

+0

'Swimming', 'Tennis' 및'Soccer '가 동일한 기본 클래스에서 파생 된 경우 generic을 사용하지 말고'List '을 사용하는 메소드를 사용해야합니다. – bluevector

답변

0

모든 유형에 RecordFields 속성이있는 것 같기 때문에 인터페이스를 추가하고 일반 형식 대신 사용할 수 있습니다.

이외의 경우 Func <> 표현식을 사용해야합니다.

0

모든 클래스가 RecordFields을 포함하는 동일한 기본 클래스에서 상속한다고 가정하면 메서드에 제네릭 제약 조건을 만들고 ifs을 완전히 제거 할 수 있습니다.

private Boolean filterList<T>(List<T> anyOutdoorSports, int numberOfPartcipants) 
    where T : OutdoorSport 
{ 
    if (anyOutdoorSports == null){ return false ;} 
    Boolean _returnValue = false; 

    if (anyOutdoorSports.Count > 0) 
    { 
     int listCount = (from rca in anyOutdoorSports 
         where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina") 
         select rca).Count(); 
     _returnValue = listCount > 0; 
    } 

    return _returnValue; 
} 
+0

'RecordFields'는 모든 하위 클래스의 기본 클래스에있는 속성이지만 여전히 다음과 같은 오류가 발생합니다. 그게 'RecordFields'는 기본 클래스와 파생 클래스 모두에서 ReadOnly입니까? 'T'에 'RecordFields'에 대한 정의가없고 'T'유형의 첫 번째 인수를 허용하는 'RecordFields'확장 메서드가 없습니다 (지시문이나 어셈블리 참조가 누락 되었습니까?) – CocaCola

+0

@CocaCola, did 메소드 서명에 "where T : OutdoorSport"를 추가합니까? –

2

Tennis, SoccerSwimming위한 공통 기본 클래스는 RecordFields 속성이있는 경우이 간단하다 :

1) 어디를 사용

private boolean FilterList<T>(IEnumerable<T> anyOutdoorSports, int numberOfParticipants) where T : OutdoorSport 
{ 
    if(anyOutdoorSports == null) return false; 
    return anyOutdoorSports.Any(s => s.RecordFields[numberOfParticipants].ToString().StartsWith("stamina")); 
} 
+0

'RecordFields'는 모든 하위 클래스의 기본 클래스에있는 속성이지만 여전히 다음과 같은 오류가 발생합니다. 그게 'RecordFields'는 기본 클래스와 파생 클래스 모두에서 ReadOnly입니까? 'T'에 'RecordFields'에 대한 정의가없고 'T'유형의 첫 번째 인수를 허용하는 'RecordFields'확장 메서드가 없습니다 (지시문이나 어셈블리 참조가 누락 되었습니까?) – CocaCola

+0

@CocaCola - Do 메소드 정의에서'where' 제약 조건을가집니다. 즉'where T : BaseClass'? – Lee

0

내가 두 가지 옵션을 볼 수 각 유형을 필터링하는 절 (세 줄 사용)

List<Soccer> Soccer = anyOutdoorSports.Where(x => x.GetType() == typeof(List<Swimming>)).ToList() 

그리고 그 foreach 스포츠 타입.

2 )

var groups = anyOutdoorSports.GroupBy(x => x.GetType()) 

이것은 스포츠

그리고있는 유형과 값은 키의 사전 인 객체를 만들 것입니다 GetType을()에 의해 그룹화에 GROUPBY LINQ 확장을 사용하여 마침내 어느 것이 어떤 값을 가지고 있는지를 알 수 있고 거기에서 무엇을 돌려 줄지 결정할 수 있습니다.