2013-08-21 4 views
2

아래에서이 기본 패턴을 따르는 코드를 작성했습니다. 나는 그것이 가고있는 동일한 목표를 성취하기 위해 더 우수하고, 더 간결하며, 더 나은 수행 아이디어가 있는지보기를 기대하고있다. 목표는 한 목록의 항목을 다른 목록의 항목과 비교하고 일치하는 경우 작업을 수행하는 것입니다. 내가 작동하도록 한 유일한 방법은 아래의 아이디어이지만, 나는 C# 및 .net에 익숙하지 않으며 더 나은 방법이 있는지 확실하지 않습니다. 당신이 목록을 변경할 필요가 없습니다 경우중첩 된 while 루프 대안

list A 
list B 
int counter; 
int counter2; 
while (counter < comparison item) 
{ 
    while (counter2 < comparison item 2) 
    { 
     if (A[counter] == B[counter2]) 
     { 
      // do stuff 
     } 
     counter2++; 
    } 
    counter++; 
} 
+0

LINQ는 가능성이 있지만 기능적으로는 똑같습니다. – siride

+0

미리 목록을 정렬하고 병합 조인 유형 작업을 수행 할 수도 있습니다. 목록의 크기와 수행 할 작업의 종류에 따라 더 빠를 수도 있습니다. 언제나 그렇듯이 측정하십시오. – siride

답변

3

이 2 루프 구조는 간단하지만 성능이 없습니다. 문제는 비교 횟수입니다. 첫 번째 세트가 N이고 두 번째 세트가 M 인 경우 N*M 개가됩니다. 각 세트에 1,000 개의 항목이 있으면 1,000,000 개의 비교를 말합니다.

더 나은 방법은 첫 번째 집합의 항목을 해시 한 다음 두 번째 집합의 항목에 대한 해시를 검색하는 것입니다. 해싱이 일정한 상각 시간에 이루어지기 때문에, 당신은 M+N 작업에서이 작업을 수행 할 수 있습니다, 또는 약 2,000 1,000 항목에 각각 두 세트 :

var setA = new HashSet<int>(listA); 
foreach (var b in listB) { 
    if (setA.Contains(b)) { 
     ... 
    } 
} 

LINQ 라이브러리는 코드도 적은 선에서이 작업을 수행 할 수 있습니다

foreach (var ab in listA.Intersect(listB)) { 
    ... 
} 
+0

답변을 주셔서 감사합니다. 두 번째 예제의 경우 목록을 List 개체 또는 HashSet 개체로 사용 하시겠습니까? – wondergoat77

+0

@ wondergoat77 어떤 컨테이너를 LINQ로 전달할지는 중요하지 않습니다. 내부적으로 해시 기반 컨테이너를 사용하여 병합을 만들고 입력을 'IEnumerable '으로 처리합니다. – dasblinkenlight

+0

끝내 주셔서 감사합니다. – wondergoat77

1

는 당신은 foreach 루프를 사용한다. 당신 이 목록을 변경해야하는 경우

foreach (var itemA in A) 
{ 
    foreach (var itemB in B) 
    { 
     if (itemA == itemB) {} 
    } 
} 

는 당신은 for 루프를 사용한다.

for (var i = 0; i < A.Count; i++) 
{ 
    for (var j = 0; j < B.Count; j++) 
    { 
     if (A[i] == B[j]) {} 
    } 
} 

경우 두리스트는 순서대로 목록을 통해 이동하여 훨씬 더 효율적으로 수행 할 수 있습니다 분류되어 있습니다.

int i = 0; 
int j = 0; 

while (A.Length <= i && B.Length <= j) 
{ 
    if (A[i] == B[j]) 
    { 
     // items are equal 
     i++; 
     j++; 
    } 
    else if (A[i] > B[j]) // Comparison of the ordered value, could be a property on the item. 
    { 
     j++; // increment B's counter 
    } 
    else 
    { 
     i++; // increment A's counter 
    } 
} 
관련 문제