1

次のコードがあります。

private void LoopThroughDependsIssues(JIRAOperations jiraOps, string jiraURL, string token, string username, string password, string projectKey, string exportTargetPath, string branch, SVNOperations svnOps, string svnExePath, string changesetDBFile, DependencyManager mgr)
        {
            var tempVar = mgr.Dependencies;
            foreach (var item in tempVar)
            {
                if (item.depends.Length > 0)
                {
                    var templist = item.depends;
                  var  listissues1 = templist.Split(',');
                     for (var i = 0; i < listissues1.Length-1; i++)
                     {
                         var newissue1 = new string[] { listissues1[i].ToString() };
                         newissue1.getChangeSet(jiraOps, jiraURL, token, username, password, projectKey, exportTargetPath, branch, svnOps, svnExePath, changesetDBFile, mgr);
                     }
                    //throw new Exception("Dependencies found");
                }
            }
        }

これで、mgr.Dependencisコレクションを反復処理しています。この値は変化していますnewissue1.getChangeSet(jiraOps, jiraURL, token, username, password, projectKey, exportTargetPath, branch, svnOps, svnExePath, changesetDBFile, mgr); 。したがって、このメソッドを呼び出すたびに、コレクションの値が増加しています。しかし、初めて正常に動作します。しかし、2回目の反復中に、次のように例外が発生しています

コレクションが変更されました。列挙操作が実行されない場合があります。

この例外は、コレクションを変更するために来ていると思います。この状況を処理する方法。

私のクラス定義は次のとおりです。

public class Dependency
     {
         public string issueID { get; set; }
         public string jirastatus { get; set; }
         public int dependencyFound { get; set; }
         public string depends { get; set; }
         public string linked_issues { get; set; }
       }

      public class DependencyManager
      {
          public List<Dependency> Dependencies { get; private set; }
          public DependencyManager()
          {
              this.Dependencies = new List<Dependency>();

          }
}
4

3 に答える 3

5

コレクションにインデックスを付けるDependenciesと、列挙子は作成されず、コレクションが変更されたときにループできます。このアプローチは、新しいアイテムがリストの最後に追加されていないか、アイテムが削除されている場合に、簡単に頭痛の種になる可能性があります。

for(int i = 0; i < mgr.Dependencies.Count; i++)
{
  var item = mgr.Dependecies[i];
  if (item.depends.Length > 0)
  {
      // code unchanged
  }
}

安全な方法は、 を使用しQueueて、最初のアイテムを入力してからmgr.DependenciesEnqueue処理する追加のアイテムを入力することです。

var toBeProcessed = new Queue<Dependency>(mgr.Dependencies);
while(toBeProcessed.Count > 0)
{
  var item = toBeProcessed.Dequeue();

  // loop

  // if a new dependency gets added that needs processing, just add it to the queue.
  toBeProcessed.Enqueue(newissue1);

}
于 2012-07-03T04:25:02.890 に答える
2

コレクションを最初からそのまま使用し、変更を気にせずに使用したい場合は、コレクションのスナップショットを撮ることができます。

var tempVar = mgr.Dependencies.ToList(); //This will create a new list with the same items
foreach (var item in tempVar) {
    ...
}
于 2012-07-03T05:27:37.930 に答える
-2

foreach を使用せず、通常のループを使用すると反復できます。最後に変更されたコレクションに行を追加するだけであれば、これは最小限の変更で機能します。

        var tempVar = mgr.Dependencies;
        var cnt = tempvar.Count(); // Only iterate items available when we start

        for (int i = 0; i < cnt; i++)
        {
           var item = tempVar[i];
于 2012-07-03T08:47:50.723 に答える