2016-07-06 145 views
4

我有一种情况,我使用ArrayList来存储文件名称列表(完整文件路径)。当我将相同文件的多个项目添加到数组中时,然后使用ArrayList.IndexOf来查找索引(我正在向BackgroundWorker报告进度),它总是返回第一个项目的索引,因为它是通过文件名搜索的。这会导致进度条出现问题,即我正在处理3个文件,完成后,该栏只有1/3满了。C#使用ArrayList.IndexOf与多个相同的项目

下面是一些示例代码(我只是在这里添加项目,但在实际的代码,他们是从列表框中添加):

ArrayList list = new ArrayList(); 

list.Add("C:\Test\TestFile1.txt"); 
list.Add("C:\Test\TestFile1.txt"); 
list.Add("C:\Test\TestFile1.txt"); 

var files = list; 
foreach (string file in files) 
    backgroundWorker1.ReportProgress(files.IndexOf(file) + 1); 

当这个运行时,只有1“百分比”的进展报告因为IndexOf每次都找到相同的文件。有没有办法解决?还是有人有另一种方式获得索引(或每个项目的唯一标识符)的建议?

+7

另一方面,是否有一个原因,你使用'ArrayList'而不是'List '?通常应避免非通用集合。他们在那里是为了向后兼容,但过去10年编写的代码最好不要使用它们。 –

+0

为什么你多次在同一个列表中有这个文件?它是否需要多次或单次处理? – weismat

+2

你可以使用'for'循环并使用递增变量而不是'IndexOf'。 –

回答

7

最简单的方法就是使用索引来遍历:

for (int i = 0; i < list.Count; i++) 
{ 
    backgroundWorks.ReportProgress(i + 1); 
    // Do stuff with list[i] 
} 
+0

谢谢,我不知道为什么我没有想到这一点。我想我最初使用的是ArrayList,因为我使用了一个需要它的旧库(可能是旧版本的.NET)。我将我的代码转换为使用列表,而是像魅力一样工作。 – Riccaforte

0

你可以让你列表的副本,然后在对其进行处理从而除去每个项目。然后,您可以返回完成百分比作为临时列表的计数除以原始列表的计数的函数。

每当您的后台工作人员处理文件并使用该int跟踪进度(完成百分比应该是int除以文件数)时,您也可以只添加一个int。

当然,无论采用哪种方法,您都需要确保以线程安全的方式修改相关变量。

1

为了实现你想要的,我会推荐使用for列表。你不会有搜索任何指标,可以很容易地报告进展到backgroundWorker1

for (int counter = 0; counter < files.Count; counter++) 
{ 
    backgroundWorker1.ReportProgress(counter + 1); 
} 

通过这样做,你不要有相同的文件名的问题。

这将是等效采用foreach

int counter = 1; 
foreach (string file in files) 
{ 
    backgroundWorker1.ReportProgress(counter); 
    counter++; 
} 

但我认为这是更好地在这种情况下使用for

0

试试这个,它适用于我阅读文件有这么多行数据的情况下罚款。

int percentage = (int)((count/(double)lineCount) * 100.0); 
    backgroundWorker5.ReportProgress(percentage); 

这里计数是总计数和linecount存在的运行计数。通过使用这两个,计算百分比。将此代码保存在for循环或while循环中。

0

假设进度最大值为100,并与加工出来的三强之一文件,它应该显示33(%)的进步,你可以指望进度处理的每个文件,并重新计算整体进度:

// list contains x file paths 
var files = list; 

double progressStep = 1/files.Count; 

for(int i = 0; i < files.Count; i++) 
{ 
    backgroundWorker1.ReportProgress((i + 1) * progressStep); 
    ... 
} 

所有剩下的就是将后台工作者的进度值分配给进度条。

相关问题