foreach循环的当前索引

Eyl*_*yla 1 c# indexing foreach loops

有没有办法知道当前的foreach运行,而不必:

Int32 i;
foreach
   i++;
Run Code Online (Sandbox Code Playgroud)

或者这是我得到的最佳选择?另外,我怎么知道该循环中的最大项目数?我想要做的是在表单上的foreach循环期间更新进度条.

这是我到目前为止:

    FileInfo[] directoryFiles = (new DirectoryInfo(folderBrowserDialog.SelectedPath)).GetFiles("*.*");
    foreach (FileInfo file in directoryFiles)
    {
        if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden || (file.Attributes & FileAttributes.System) == FileAttributes.System)
            continue;

        backgroundWorkerLoadDir.ReportProgress(i, file.Name);
        System.Threading.Thread.Sleep(10);
    }
Run Code Online (Sandbox Code Playgroud)

所以它应该如下,对吧?

   for (Int32 i = 0; i < DirectoryFiles.Length; i++)
   {
       if ((DirectoryFiles[i].Attributes & FileAttributes.Hidden) == FileAttributes.Hidden || (DirectoryFiles[i].Attributes & FileAttributes.System) == FileAttributes.System)
           continue;

       backgroundWorkerLoadDir.ReportProgress((i / DirectoryFiles.Length) * 100, DirectoryFiles[i].Name);
       System.Threading.Thread.Sleep(10);
   }
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 7

Foreach是一个相当大的交易,它的底层管道是一个非常简单的前向迭代器,它不需要事先知道集合中有多少项.IEnumerator的<>.

通常情况下,与ProgressBar相比,这是一个相当令人讨厌的不匹配.当您事先知道要迭代的项目数时,您只能有意义地更新标准项目.所以你可以设置它的最大属性.如果这是可能的,那么你无疑有权访问Count属性,并有一个索引为好.然后让你使用for()语句,问题解决了.

但是你很不知道有多少项要迭代.例如,典型的dbase查询.由于您无法确定迭代可能需要多长时间,因此进度条上只有一个选项:Style = Marquee."我没有死,我正在努力"报告进展的方式.问题解决了.


Tas*_*han 6

使用for循环而不是foreach.在这种情况下,情况会更好.

像这样使用它:

count = DirectoryFiles.Length;
for (int k = 0; k < count; k++)
{
    FileInfo file = DirectoryFiles[k];
    if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden || 
        (file.Attributes & FileAttributes.System) == FileAttributes.System)
    {
        continue;
    }

    backgroundWorkerLoadDir.ReportProgress(i, file.Name);
    System.Threading.Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)