2010-01-18 6 views
0

필자가 쓴 몇 가지 기능을 사용하여 100 개의 다른 파일과 비교해야하는 파일이 3 개 있습니다. 나는 3 개의 파일에서 각각의 파일을 가져 와서 루프를 100 개의 파일 각각과 비교합니다. 나는 함수를 순차적으로 사용하고 싶다. 3 개의 파일을 100 개의 파일과 비교 한 후, 다음 함수를 활성화하고 싶다. 어떻게 할 수 있는가? (함수의 시그니처는 똑같아서 델리게이트를 사용할 수있다. 두 루프 후C#의 대표자

for(i=0;i<3;i++) 
{ 
for(j=0;j<100;j++) 
    compare(filesArr1[i],filesArr2[j]); 
} 

난 다음 비교 기능을 활성화하려면 종료 ...이 것 모두의

답변

2

다음 코드는 루프를 실행을 두 번 제공; comp1을 처음 호출하고 두 번째로 comp2를 호출합니다. 좀 더 쓰기에 의한 비교 함수)의 수를 증가시키고, b)는 다음 라인에 자신의 이름을 추가 할 수

ComparisonDelegate [] 비교 = 새로운 ComparisonDelegate [{COMP1, COMP2};

delegate bool ComparisonDelegate(string file1, string file2); 

    static bool comp1(string file1, string file2) { return true; } 
    static bool comp2(string file1, string file2) { return false; } 

    ComparisonDelegate[] comparisons = new ComparisonDelegate[] { comp1, comp2 }; 

    void runComparisons() 
    { 
     foreach (ComparisonDelegate cd in comparisons) 
     { 
      for (int i = 0; i < 3; i++) 
      { 
       for (int j = 0; j < 100; j++) 
       { 
        bool retVal = cd(filesArr1[i], filesArr2[j]); 
       } 
      } 
     } 
    } 

바라건대 당신은이

+0

예 !!!! 고맙습니다!! 그건 그렇고, 기능은 정적이어야합니까 ? – aharon

+0

@aharont, 그들은 통계 일 필요는 없습니다. 대리인은 인스턴스 메서드의 "수신자"를 캡처 할 수 있습니다. –

1

1 : 비교를위한 의사 코드는 내가 모르는 방법) 여기 입니다 훨씬 빠르고 주된 루프 만 100 개의 파일을 통과하고 그 안에 3 개의 파일을 비교하면 다음과 같습니다.)

for(int index = 0; index < 100; index++) 
{ 
    // then all actions here 
} 

다음. 일부 단계 후에 다른 비교 함수로 전환해야하는 경우 작업 대리자 전환을 다른 함수로 변경해야합니다. 그러나 위임자를 전환하거나 다른 함수를 호출하는지 여부에는 차이가 없습니다. 3 번째 파일에 대한 다른 함수 호출이 필요합니다. 왜 당신이 전환해야하는지에 대한보다 공식화가 필요하며, 이것이 전제 조건에 달려 있습니다.

+0

당신이 더 자세히 첫 번째 문장을 설명 할 수에 맞게 적용 할 수 있습니까? * 명확한 것은 아닙니다 * 특히 * 두 개의 루프가 있습니다 ... 제가 말할 수있는 한, OP는 3 개의 파일 각각을 100 개의 파일 각각과 비교하여 한 번 비교 한 다음 다시 전체 작업을 수행하려고합니다. 다른 비교 기능으로 –

+0

@Jon 그냥 내 대답에 코드 샘플을 추가했습니다. 저는 태도를 바꾸고 우선 과제를 공식화 할 것을 제안합니다. 성능 POV에서 루프 순서와 큰 차이가없는 것일 수도 있지만 실제로 OP의 한 가지는 세 번째 파일에 대해 하나의 함수를 호출하는 반면 처음 두 개에는 다른 코드를 사용하고 모든 코드는 명확하고 단 하나의 루프 만 사용할 수 있습니다. 그리고 네, 그는 비교 제공자로서 2 명의 다른 대표를 제공하는 공통된 기능을 사용할 수 있습니다. – terR0Q

+1

아우터 루프를 사용하는 대신에 100 개의 루프 내에서 절차 적으로 세 가지 비교 ("여기 모두 동작")를 수행하십시오. 이는 바깥 루프의 3 증분 및 비교 연산 만 제거합니다. – AaronLS

3

좋습니다. 기본적으로 비교를 통해 일반적인 방법을 매개 변수화하려고합니다. 이런 식으로 뭔가가 당신을 위해 작동합니다 :

public void CompareFiles(IEnumerable<string> firstFiles, 
         IEnumerable<string> secondFiles, 
         Action<string, string> comparison) 
{ 
    foreach (string file1 in firstFiles) 
    { 
     foreach (string file2 in secondFiles) 
     { 
      comparison(file1, file2); 
     } 
    } 
} 

다음과 전화 : 비교 방법을 가정 것

CompareFiles(arrFiles1, arrFiles2, FirstComparison); 
CompareFiles(arrFiles1, arrFiles2, SecondComparison); 

이미 적절한 조치를 취합니다. 반환해야 할 경우에는 Func 설명을 사용하는 것이 좋습니다. 자세한 내용이 유용 할 것입니다.

+0

액션 및 기능 팬. –

+1

IList 을 사용하고 IEnumerable 을 사용하지 않는 특별한 이유가 있습니까? –

+0

@Oliver : 확실하지 않습니다 ... 내가 쓰기 시작했을 때가 아니라고 생각합니다. 끝으로는 아닙니다 :) 편집 ... –

0

당신이 비교 기능을 변경하려면 얼마나 많은 반복 후 알고 있다면, 당신은 대의원에 대한 필요하는 경우 기본 (또는 스위치) 수행 할 수 있습니다

if (0 < j) && (j < 2) 
     compare1() 
    else 
    if (2 < j) && (j < 10) 
    compare2() 
    else 
    compare3()