2016-08-08 66 views
0

我用於查找文本詞與它的indexOf返回帶有字段字和數量對象的名單得到了功能,我想使用功能不同的文字和語言來這樣的IM創建任務並獲得IndexOutOfRange該行:System.IndexOutOfRangeException在功能findinding在文本與詞的IndexOf

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); 
+0

的可能的複製[什麼是IndexOutOfRangeException,如何解決?(http://stackoverflow.com /問題/ 20940979 /什麼-是-indexoutofrangeexception和 - 如何-DO-I-FIX-它) –

+2

變化'爲(VAR I = 0; I 3615

+0

以及我只是想你了,現在我得到其他兩種例外信息:System.ArgumentException,我的理解這意味着像任務之一是零而另一個例外是像System.NullReferenceException – vtarbinskyi

回答

1

的問題是,lambda表達式將不可複製的參數的值,而只是使用確切的變量來代替。 所以在你的循環結束之後,我會比數組長度更大,因此會引發異常。

爲了解決該問題,請在下面的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(); 
+0

的「<」符號已經從'0'到'X確實給 - 1'在IST自己,你不必添加-1末... – zockDoc

+0

我只是tryed的方式zockDoc和我得到這個現在例外:analyzeobjs [I]的.text = tnw.text [I] - System.NullReferenceException還我得到這一個在爲WaitAll(任務)System.AggregateException – vtarbinskyi

+0

哦,找你的權利我忘帶了什麼東西。我會編輯我的帖子 – zockDoc

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