2017-07-10 13 views
1

私はこの1つに苦労しています。列挙の一部ではない別のコレクションを変更しているので、なぜこの特定のエラーがスローされているのかを論理的に見ることはできません。コレクションが変更されました。列挙操作は実行できません(別のコレクションで)

は、以下のif文で「リンク」を削除しようとしたとき

var ResultsDict = cache["ResultsDictionary"] as Dictionary<string, ContentModel>; 

var Resultscopy = ResultsDict.ToDictionary(x => x.Key, x => x.Value); 
var ResultsList = new List<ContentModel>(); 

foreach (var Result in ResultsDict.ToList()) 
{ 
    foreach (var link in Result.Value.LinksOnNode) 
    { 
     if (ResultsDict.ContainsKey(link)) 
     { 
      Resultscopy[Result.Key].LinksOnNode.Remove(link); 
     } 
    } 
} 

例外がスローされた私のコードです。しかし、私は理由を見ることができません。 ResultsCopyは、foreachループが列挙しているResultsDictコレクションとは完全に別のコレクションである必要があります。

誰かが私が逃したものを私に説明してもらえますか?ここで私はかなり理解していない基本的なものがあるようです。

私はいくつかのポストを通過して解決策を試しましたが、何も動作していないようです。私は参照を作成せずにResultsDictのコピーを作成するために考えることができるすべてを試しましたが、私はまだこのエラーが発生し続けます。

+0

かいつまん:あなたは 'foreach'ループ内で使用されているコレクションを変更することはできません。代わりに 'for'を使用してください。 – Alex

+0

@Alexコードを読むと、彼は彼が変更している同じコレクションをループしていません – EpicKip

+0

しかし、変更しようとしているコレクションのIMはforeachループの外ですか?そのコレクションではなく、私はループしている – user2920648

答えて

2

だから、あなたが変更されています

Resultscopy[Result.Key].LinksOnNode.Remove(link); 

しかし、また、「LinksOnNode」コレクション反復:私はコレクション「LinksOnNode」の一つでも(これらを覚えて反復されていることを考える

foreach (var link in Result.Value.LinksOnNode) 

を同じになります)。

はこれにあなたのforeachを変更してみてください:

foreach (var link in Result.Value.LinksOnNode.ToArray()) 
+0

ToArrayではなくToList()を使用していますが、この回答は私のために働いていました。 私は許可されたときに私は答えを受け入れるでしょう。 入れ子にされたコレクションはまだコピーされたコレクションで参照されることはありません – user2920648

+0

もちろん...それは深いコピーではありません... ToArray()はちょうど新しい*コレクション*を作成しているようですが、オブジェクトは同じです... –

関連する問題