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)
Foreach是一个相当大的交易,它的底层管道是一个非常简单的前向迭代器,它不需要事先知道集合中有多少项.IEnumerator的<>.
通常情况下,与ProgressBar相比,这是一个相当令人讨厌的不匹配.当您事先知道要迭代的项目数时,您只能有意义地更新标准项目.所以你可以设置它的最大属性.如果这是可能的,那么你无疑有权访问Count属性,并有一个索引为好.然后让你使用for()语句,问题解决了.
但是你很不知道有多少项要迭代.例如,典型的dbase查询.由于您无法确定迭代可能需要多长时间,因此进度条上只有一个选项:Style = Marquee."我没有死,我正在努力"报告进展的方式.问题解决了.
使用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)
| 归档时间: |
|
| 查看次数: |
14565 次 |
| 最近记录: |