2009-07-22 47 views
0

嘿,我有一个循环,将聚集的字符串和整数添加到对象中,然后将该对象添加到列表中。我需要它来检查是否已经有一个对象具有一个属性==给我要分配的对象,然后根据属性是哪一个,我要么改变它的一个属性,要么添加一个新的属性目的。我将在稍后分类。这是我卡住的地方。我已经标记了该行(当前注释掉),当它被激活时,会导致命令行冻结。奇怪的是,我早先使用IDENTICAL代码没有问题。将对象添加到列表时,c#循环失败!

正如你所看到的,我还有一些其他的代码目前已被注释掉,因为这个位需要在我能继续之前工作,但是我留下了它让你对我正在做的事有了更多的了解。

解决了。我实际上不得不将它向上移动两圈。谢谢!

 //IF THIS IS THE FIRST ONE, ADD IT! 
     var refSize = Referrals.Count(); 
     if (refSize == 0) 
     { 
     var NewReferral = new Referral(referringURL.Trim(), referringWords.Trim(), 3); 
     Referrals.Add(NewReferral); 
     } 
     else 
     { 
     for (int i=0;i<refSize;i++) 
     { 

      // RESET BOOLS 
      URLPresent = false; 
      KeywordPresent = false; 

      // IF THE URL IS ALREADY PRESENT 
      //if (Referrals[i].URL == referringURL) 
      //{ 
       //URLPresent = true; 

       // CHECK IF THE KEYWORD IS ALREADY PRESENT 
       //for (int ii=0;ii<Referrals[i].Keywords.Count;ii++) 
       //{ 
       // if (Referrals[i].Keywords[ii] == referringWords) 
       // { 

         // ADD TO OCCURRENCES 
       //  Referrals[i].Occurrences++; 
       //  KeywordPresent = true; 
       // } 
       //} 

       // ADD KEYWORD TO LIST 
       // ### 
       // ### 
      //} 

      // IF THE KEYWORD ISN'T THERE && THE URL ISNT THERE, ADD A NEW REFERRAL OBJECT 
      if (URLPresent == false && KeywordPresent == false) 
      { 
       var NewReferral = new Referral(referringURL.Trim(), referringWords.Trim(), 3); 
       //Referrals.Add(NewReferral); //HERE IS MY PROBLEM! UNCOMMENTING THIS LINE CAUSES A FAIL. 

       //URLPresent = true; 
       //KeywordPresent = true; 
      } 

      // IF THE URL IS THERE, BUT THE KEYWORD ISNT, ADD AN ELEMENT TO THE REFERRAL.KEYWORDS LIST 
      //else if (URLPresent == true && KeywordPresent == false) 
      //{ 
       //Referrals[i].Keywords.Add(referringWords); 

       //URLPresent = true; 
       //KeywordPresent = true; 
      //} 

     } 
     } 

回答

6

具体的问题是,你正在追逐自己的尾巴。每次向列表添加新元素时,Refferals.Count都会上升(如果您继续添加元素,您的循环将永远不会结束)。您应该拉算出来到一个变量,并使用到您的循环或使用类似Referrals.Contains ...

var refSize = Refferals.Count(); 

for (int i=0;i < refSize; i++) 
{ 
// same 
} 
+0

+1打我10秒 – 2009-07-22 15:04:42

0

每次添加一个参照对象,以您的推荐列表中,您都导致环路采取一个额外的迭代。如果您在每次迭代中都添加引用,则循环将无限期运行。

尝试在您注释掉的行上放置一个断点。它应该被反复打击。你正在经历的冻结是由你的无限循环造成的。

1

问题是,在将它添加到列表后,循环会遍历新添加的项目并再次添加它(可能是由于您在某处产生的错误),这将永远重复。

你可以在调试器中浏览你的代码并查看。

顺便说一句,你不应该在循环中调用Count()方法。相反,使用Count属性(无括号)