如何在C#中将foreach循环转换为for循环

3
foreach (Process newprcs in oPrcs)
 {
  newprocid = (UInt32)newprcs.Id;
  if (!oNewProcs.Contains(newprocid))  //checking process id contain or not
    {
      oNewProcs.Add(newprocid);
      // MessageBox.Show(newprocid.ToString());
      uIdOfProcess = newprocid;
      //MessageBox.Show(uIdOfProcess.ToString(),"ProcessId");
      CInjector.HookingAPI(uIdOfProcess, "HookPrintAPIs.dll");
    }
}
2个回答

9

这取决于oPrcs的类型。如果它是一个Process[],那么代码应该是:

for (int i = 0; i < oPrcs.Length; i++)
{
    Process newprcs = oPrcs[i];
    ...
}

否则,如果oPrcs的类型实现了IEnumerable<Process>(它不一定要这样做,但通常会这样做),你将得到:
using (IEnumerator<Process> iterator = oPrcs.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        Process newprcs = iterator.Current;
        ...
    }
}

说了这么多,通常我不会将foreach循环转换为for循环...


+1 如果需要索引,我宁愿在某个地方加入计数器。 - mhenrixon
如果你遇到这样的错误:“集合已修改;可能无法执行枚举操作。”,你会将foreach循环转换为for循环吗? - Mike Barnes
@MikeBarnes:我通常会尝试找出为什么会出现这种情况,并避免它。仅仅将其改成“for”循环仍然可能存在潜在的危险。 - Jon Skeet
@JonSkeet 当我尝试在foreach中向字典添加内容时,出现了错误。只有当我循环遍历第二个项目时才会出现错误。现在要创建一个堆栈帖子。 - Mike Barnes

4
假设oPrcs是一个IList<Process>(因此它具有Count属性,并且可以通过索引访问项目):
for (int i = 0; i < oPrcs.Count; i++)
{
    Process newprcs = oPrcs[i];
    if (!oNewProcs.Contains(newprocid))  //checking process id contain or not
    {
        oNewProcs.Add(newprocid);
        // MessageBox.Show(newprocid.ToString());
        uIdOfProcess = newprocid;
        //MessageBox.Show(uIdOfProcess.ToString(),"ProcessId");
        CInjector.HookingAPI(uIdOfProcess, "HookPrintAPIs.dll");
    }
}

补充FM所说的,这取决于你拥有的集合类型。所有由foreach支持的集合都没有Count或Length属性。 - mahju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接