系统.使用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);

系统.使用IndexOf在文本中查找单词的函数中的IndexOutOfRangeException

   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();