我有一种情况,我使用ArrayList来存储文件名列表(完整文件路径).当我向数组添加同一文件的多个项目时,使用ArrayList.IndexOf查找索引(我向BackgroundWorker报告进度),它总是返回第一个项目的索引,因为它按文件名搜索.这会导致进度条出现问题,即我正在处理3个文件,完成后,条形仅为1/3满.
这是一些示例代码(我只是在这里添加项目,但在实际代码中它们是从ListBox添加的):
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);
Run Code Online (Sandbox Code Playgroud)
当此运行时,仅报告1"百分比"的进度,因为IndexOf每次都找到相同的文件.有没有办法解决?或者是否有人建议以另一种方式获取索引(或每个项目的任何唯一标识符)?
我一直在寻找如何做到这一点的日子,没有什么是我需要做的(或者我只是不明白如何实现解决方案).
我需要做的是将一个字符串(一个街道地址)解析成TStringList,然后将这些字符串从列表中设置为变量然后传递给程序的其余部分.我已经把列表运行正常了:
var
AddressList : TStringList;
i : integer;
begin
AddressList := TStringList.Create;
AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr; //RawAddressStr is parsed from another file and the string result is something like '1234 Dark Souls Lane Wyoming, MI 48419'
for i := 0 to AddressList.Count-1 do
AddressList.Strings[i]; //Not sure what to do here
Run Code Online (Sandbox Code Playgroud)
问题是地址长度不一样.地址有时候会像'1234 Dark Souls Two Lane Wyoming ......'或'1234 Dark Lane Wyoming ......'
所以我需要能够使用这个TStringList将Zip,State和City设置为变量供以后使用.我会使用TStringList.Find,但邮政编码并不总是相同.有没有办法获得最后一个字符串,然后从那里后退?(向后退,因为一旦我获得City,状态ZIP我可以从RawAddressStr中删除它,然后将其余部分设置为地址字符串.)
谢谢.
编辑,这是我需要的代码(感谢下面的评论):AddressList:= TStringList.Create;
AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr;
for i := 0 …Run Code Online (Sandbox Code Playgroud) 我已经在这个主题上搜索了几天,但我没有遇到任何似乎相关的东西。请记住,我仍在学习如何在 C# 中使用 BackgroundWorker 和多线程。
我在使用 ReportProgress 方法时遇到问题。这是我正在做的一个小例子。
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
if (!backgroundWorker1.CancellationPending)
{
// bunch of code for handling a multiple-page PDF file using Ghostscript.NET
for (var pageNumber = 1; pageNumber <= pageCount; pageNumber++)
{
if (!backgroundWorker1.CancellationPending)
{
// get file path and file name, convert page to image file
// after converting page to image file do:
backgroundWorker1.ReportProgress(pageNumber); // Here is the problem
}
else
e.Cancel = true;
...
}
}
}
private void …Run Code Online (Sandbox Code Playgroud)