系统.使用IndexOf在文本中查找单词的函数中的IndexOutOfRangeException
本文关键字:使用 函数 IndexOutOfRangeException 单词 查找 文本 系统 IndexOf | 更新日期: 2023-09-27 18:01:29
我得到了一个函数,用于在文本中查找单词,其返回具有字段word和quantity的对象列表的索引,我想将该函数用于不同的文本和单词,以便我创建任务并在该行上获取indexoutorange:
var r = Check_text(tnw.text[i], word);
要了解更多,这是我的功能:
public static List<wordsinf> Check_text(string text,string[] words)
{
List<wordsinf> result = new List<wordsinf>();
var pos = 0;
var quantity = 0;
foreach (string wf in words)
{
pos = 0;
quantity = 0;
while (true)
{
var foundPos = text.IndexOf(wf, pos);
if (foundPos == -1)
{
break;
}
pos = foundPos + 1;
if (foundPos >= 0)
{
quantity++;
}
}
result.Add(new wordsinf(wf, quantity));
}
return result;
}
输入的例子:
- word {string[2]} string[]
[0] "asd" string
[1] "qwe" string
- tnw.text {string[2]} string[]
[0] "asd qwe ssd www " string
[1] "asd asd qwe sss " string
谁能告诉我这个问题的解决方法?我哪里做错了。还有部分任务:
var numtasks = tnw.text.Length;
AnalyzeObj[] analyzeobjs = new AnalyzeObj[numtasks];
var word = tnw.words.Split(',');
Task[] tasks = new Task[numtasks];
Console.WriteLine(word);
Console.WriteLine(tnw.text);
for (var i = 0; i < numtasks; i++)
{
tasks[i] = new Task(() => {
var r = Check_text(tnw.text[i], word);
analyzeobjs[i].text = tnw.text[i];
analyzeobjs[i].WordInfos=r;
analyzeobjs[i].id=Guid.NewGuid();
analyzeobjs[i].FindWords = word;
});
tasks[i].Start();
}
Task.WaitAll(tasks);
for (var i = 0; i < numtasks; i++)
{
var i1 = i;
tasks[i] = new Task(() =>
{
var item = new AnalyzeObj();
var r = Check_text(tnw.text[i1], word);
item.text = tnw.text[i1];
item.WordInfos = r;
item.id = Guid.NewGuid();
item.FindWords = word;
analyzeobjs.Add(item);
});
tasks[i1].Start();
}
问题是Lambda表达式不会复制参数的值,而只是使用该变量。因此,在循环结束后,i将大于数组长度,因此会抛出异常。
要解决这个问题,可以在for循环中执行以下操作:
tasks[i] = new Task(new Action<object>((val) => {
var c = (int)((object[])val)[1];
var t = ((object[])val)[0].ToString();
var r = Check_text(t, word); //Use the parameter val instead
analyzeobjs[c].text = t; //Use the parameter val instead
analyzeobjs[c].WordInfos=r;
analyzeobjs[c].id=Guid.NewGuid();
analyzeobjs[c].FindWords = word;
}), new object[2] { tnw.text[i], i });
tasks[i].Start();