2017-11-21 3 views
-1

이것은 매우 어려움을 겪었습니다.Foreach 중첩 루프 반복 없음

IEnumerable IGrouping 개체에 그룹화 된 공통 키 항목이 있습니다. 이제 IEnumerable IGrouping 개체 자체의 동일한 공통 키 항목을 각각 비교해야합니다. 그것을 달성하기 위해 2 개의 foreach 루프를 사용했지만 문제는 foreach가 반복을 유발한다는 것입니다. 나는 이미 통과 한 것을 반복하지 않고 각 항목을 반복하고 비교할 필요가있다.

Parallel.ForEach((sameQuickHashGroups, quickHashGroup) => 
{ 
    foreach (var groupFile in quickHashGroup) 
    { 
     foreach (var groupFile2 in quickHashGroup) 
     {        
      if (HashTool.ByteToByteCompare(groupFile.FileName, groupFile2.FileName)) 
      { 
       groupFile.FullHash = count.ToString(); 
       groupFile2.FullHash = count.ToString(); 
      }               
     } 
     count; 
    } 
}); 

누구든지 해결할 수 있습니까?

+0

'quickHashGroup'은 순수한'IEnumerable'입니까, 아니면 배열이나리스트입니까? – Evk

+0

@Evk 순수한 IEnumerable입니다. – user2672399

+3

문제를 보여주는 * 완전한 * 간결한 샘플을 게시하십시오. https://stackoverflow.com/help/how-to-ask – jeroenh

답변

0

이제 질문을 이해한다고 가정하면 (기본적으로 첫 번째 답변에 표시됨) 기본적으로 각 요소 쌍을 한 번만 비교하는 방법을 묻습니다.

Linq의 ToList()을 IEnumerable에 사용하고 foreach 루프 대신 for 개의 루프를 사용합니다. 번만 요소들의 각 쌍을 비교할 수
이 방법 : 두 번째 루프는 I + 1에서 시작부터 제 1 루프는, 카운트 2 만가는 것을

var quickHashGroupList = quickHashGroup.ToList(); 
for(var i = 0; i < quickHashGroupList.Count-1; i++) 
{ 
    var groupFile = quickHashGroupList[i]; 
    for(var j = i+1; j < quickHashGroupList.Count; j++) 
    { 
     var groupFile2 = quickHashGroupList[j]; 
     if (HashTool.ByteToByteCompare(groupFile.FileName, groupFile2.FileName)) 
     { 
      groupFile.FullHash = count.ToString(); 
      groupFile2.FullHash = count.ToString(); 
     }  
    } 
} 

참고.

+0

그러면 모든 중복 비교가 제거되지는 않습니다. 리스트가 [1,2]라고 가정하십시오. 1과 1을 비교하고, 1은 2, 2는 1 (중복), 2는 2 (점검에 의해 제거됨)를 비교합니다. – Evk

+0

나는 그것이 OP가 원했던 것이라고 생각했지만, 나는 그 질문을 오해했을지도 모른다. 잠깐만 다시 읽어봐. –

+0

어떤 경우에도 인덱스를 필요로하지 않는다. 동일한 오브젝트이기 때문에'groupFile! = groupFile2'와 비교하면된다. – Evk