foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
for (int i = 0; i < textToSearch.Length; i++)
{
List<MyProgress> prog = new List<MyProgress>();
if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
{
resultsoftextfound.Add(file + " " + textToSearch[i]);
numberoffiles++;
prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString(), Report3 = textToSearch[i] });
backgroundWorker1.ReportProgress(0, prog);
}
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
continue;
}
}
MyProgress课程
public class MyProgress
{
public string Report1 { get; set; }
public string Report2 { get; set; }
public string Report3 { get; set; }
}
在内部循环中,textToSearch包含多个项目,例如:
你好世界
如果同一文件中存在多于两个单词,则根据文件中找到的单词/文本数量,它将报告相同文件两次或三次。
如何让循环更多地查找文件中的文本但只报告文件一次?
此行仅报告一次。 如果在文件中找到2或3个结果仅报告一次。在许多情况下,它报告的文件是同一文件的两倍或三倍。
backgroundWorker1.ReportProgress(0, prog);
稍后在progresschanged上我将文件作为字符串添加到listView
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
List<MyProgress> mypro = e.UserState as List<MyProgress>;
ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);
label15.Text = mypro[0].Report2;
label15.Visible = true;
if (ListViewCostumControl.lvnf.Items.Count > 9)
textBox4.Enabled = true;
}
此行将文件结果添加到listView
ListViewCostumControl.lvnf.Items.Add(mypro[0].Report1);
我不想更改循环只是为了让它在完成搜索后报告每个文件一次。
答案 0 :(得分:1)
如果没有一个好的Minimal, Complete, and Verifiable code example能够清楚地显示您的代码现在所做的事情,并且准确地描述了您希望它做什么,那么即使不是不可能确定您的代码是什么也很困难想。
但如果我正确理解了这个问题,那么解决方案就像维护一个标志一样简单,该标志表明您是否报告了当前文件,并且只有在没有设置标志的情况下才报告该文件然而。 E.g:
foreach (string file in filePathList)
{
try
{
_busy.WaitOne();
if (worker.CancellationPending == true)
{
e.Cancel = true;
return;
}
bool reportedFile = false;
for (int i = 0; i < textToSearch.Length; i++)
{
List<MyProgress> prog = new List<MyProgress>();
if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
{
resultsoftextfound.Add(file + " " + textToSearch[i]);
if (!reportedFile)
{
numberoffiles++;
prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString(), Report3 = textToSearch[i] });
backgroundWorker1.ReportProgress(0, prog);
reportedFile = true;
}
}
}
numberofdirs++;
label1.Invoke((MethodInvoker)delegate
{
label1.Text = numberofdirs.ToString();
label1.Visible = true;
});
}
catch (Exception)
{
restrictedFiles.Add(file);
continue;
}
}
我还要指出,您似乎正在使用List<MyProgress>
传递ReportProgress()
方法的信息,这是没有充分理由的。该列表中只有一个元素,因此您也可以只传递MyProgress
值本身,而不是包含该值的列表。
如果上述问题无法解决您的问题,请改进问题,以便更容易理解。