2011-08-25 62 views
1

例如爲什麼我的內循環迭代少於出循環?很奇怪?

  foreach(var toCheck in query) 
      { 
       foreach (var againstItem in totalWeight) 
       { 
        count1++ 
        if (getIEnumerable(toCheck,againstItem).Any(
          x => { count2++; return (x == againstItem.Key); })) 
        { 
         blacklist.Add(toCheck); 
         break; 
        } 
        count3++; 
       } 
      } 

的結果是: count1 = 166184 count2 = 30620 count3 = 165848

我期待count2就要大得多相比count1count3

+1

你的問題是什麼?你期望什麼結果? –

+0

如果GetIEnumerable在80%的情況下返回空,另一個則返回1個元素,它非常依賴於數據 – V4Vendetta

+0

。 – MrFox

回答

2

如果沒有要枚舉的項目,則循環將不會運行並且count2將不會增加。

你的情況可能嗎?

2

條件裏面的代碼塊

x => { count2++; return (x == againstItem.Key); } 

對列表中的每個項目評估一次

這就是.Any方法的含義 - 它確定枚舉中的任何項是否滿足給定的條件。它必須評估每個項目的條件並查看結果是否爲truefalse。雖然一旦發現它true然後執行停止在那裏。

+1

不是100%爲真,因爲IEnumerable.Any()會在滿足條件的項目時停止迭代。 – Pete

+0

@Pete對,謝謝 –

5

count2將爲getIEnumerable(...)返回的集合中的每個元素遞增一次,直到在該集合中找到匹配爲止。

如果該函數返回空的集合,那麼COUNT2可以很容易地超過COUNT1小

0

我真的不知道C#,但我的猜測是,

count1計數所有的循環,每一次

count2,只有在發現命中時才計數。就像前面的傢伙只是說,如果你沒有元素,它不會遞增

count3計算不符合的條件,所以每次發現一個命中,它會休息,不會做count3 ++