我有以下代码。
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);
中发生变化
因此,对于此方法的每次调用,我的集合值都在增加。但这是第一次它工作正常。但是,当第二次迭代时,它将异常作为
收藏被修改;枚举操作可能无法执行。
我认为这个例外即将发生变化。如何处理这种情况。?
我的课程定义如下。
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>();
}
}
答案 0 :(得分: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.Dependencies
中的初始项目填充它,然后使用Enqueue
填充您要处理的任何其他项目。
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);
}
答案 1 :(得分:2)
如果您想要的只是在开始时使用该集合,而不关心更改,您只需拍摄该集合的快照:
var tempVar = mgr.Dependencies.ToList(); //This will create a new list with the same items
foreach (var item in tempVar) {
...
}
答案 2 :(得分:-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];