2013-08-15 2 views
2

첫 줄에 열 이름이 있고 줄> 1에있는 값을 가진 CSV 파일을 읽습니다. 열 이름의 위치를 ​​가져와야합니다. 내가 생각할 수있는 유일한 방법은 스위치 또는 ifs 중 하나를 수행하는 것입니다. 나는 어딘가에서 내 경우에는 if()를하는 것이 더 빠르다는 것을 읽었다. 그러나 파일에는 많은 열 (~ 120)이 있습니다. 대안이 있는지 궁금합니다.else 및 if 문이 많습니까?

private static void Get_Position(string line, performance p) 
{ 
    string[] line_split = line.Split(','); 
    for (int i = 0; i < line_split.Length; i++) 
    { 
     if (line_split[i].Contains(@"(0)\% Processor Time")) 
     { 
      p.percore[0] = i; 
     } 
     else if (line_split[i].Contains(@"(1)\% Processor Time")) 
     { 
      p.percore[1] = i; 
     } 
     else if (line_split[i].Contains("Private Bytes")) 
     {} 
     else if (line_split[i].contains("DPC") 
     { 
     } 

     //on and on and on with else ifs 
+0

'Get_Position'에 의해 특정 열의 색인을 의미합니까? –

+0

모든 라인이 정말로 (_ 숫자가 1 씩 증가합니다 _) \ % Processor Time? –

+0

@AustinSalonen, 예, 열의 위치입니다. 검색 할 단어는 고유합니다 (120 개) –

답변

6

루프를 사용하지 못하게하는 요인은 무엇입니까? else if는 다음 조건 내부 break를 사용할 수 if

for (int i = 0; i < line_split.Length; i++) 
{ 
    for(var j = 0; j < 120; j++) 
    { 
     if(line_split[i].Contains(@"(" + j + ")\% Processor Time")) 
     { 
     p.percore[j] = i; 
     } 
    } 
... 

동일한 기능을 유지합니다.

편집 : 편집 결과 이제 포함 된 문자열에 명확한 패턴이 없음이 분명해졌습니다. 그래도 120 if/else if 문을 작성하는 경우 어떤 유형의 컬렉션에서 찾고자하는 것을 저장해야합니다. 예를 들어 목록이 작동합니다. 그런 다음 루프에서 컬렉션의 인덱스 j 액세스 : 성능에 관한 한 매우 자주까지 사용하는 문제 (스위치 대 ... 만약 다른 경우)하지 않는

... 
var listOfSearchItems = new List<string>() { "Private Bytes", "DPC" }; 

for (int i = 0; i < line_split.Length; i++) 
{ 
    for(var j = 0; j < 120; j++) 
    { 
     if(line_split[i].Contains(listOfSearchItems[j]) 
     { 
     p.percore[j] = i; 
     } 
    } 
... 
+0

'j'가 'i'여야합니다. –

+0

@Joe는 다른 방향입니다. 조건부 루프의 i는 j 여야합니다. –

+0

@JoeEnos 고마워, 나는'j'가 있어야만했던 곳으로'i'을 바꿨다. –

0

. 컴파일러와 jit은 일반적으로 최선의 코드를 최적화합니다. 결정 요인은 결정 트리를 계산 된 goto로 증류 할 수 있는지 여부입니다. switch 문을 쓰고 else if else if 구문을 작성하고 Reflector와 같은 것을 사용하여 컴파일 된 어셈블리를 보면 이것을 볼 수 있습니다.

흔히 그렇듯이 가장 명확하고 읽기 쉬운 방법으로 작성하십시오. 컴파일러와 jit은 일반적으로 성능을 향상시키는 데 필요한 작업을 다시 수행합니다. 성능이 중요하고 코드가 병목 현상 인 경우에만 코드를 재구성하여 성능을 향상시키는 것이 좋습니다 (종종 가독성을 희생해야 함).

그렇다면 Dan의 대답은 큰 스위치 또는 큰 스위치보다 훨씬 명확하고 읽기 쉽습니다.

관련 문제