2017-11-21 12 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から始まるので、最初のループは、カウント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

関連する問題