2012-04-30 56 views
1

我認爲這是一個延遲執行的執行問題,但也許我錯過了點有些迭代一個集合哪兒

我有一個循環從而

List<int> processed = new List<int>() 
foreach(KeyValuePair<int,bool> tbl1 in tables.Where(z=>!processed.Contains(z.Key))){ 
    //do some stuff...etc 
    processed.Add(someInt); 
} 

我覺得這是很危險的,但延期執行實際上是否能夠實現這一目標? 它確實似乎迭代我有點輕聲說'如預期',但... 問題是我猜 大概這是一個壞主意,通常搞亂您正在迭代的集合是壞的。

想法? 感謝

確定要清楚.. 問題是

說表被填充這樣

1,真 2,假 3,假 4,假 5,假 6,假

第一圈我在tbl1中獲得{1,true}並在第二圈添加說2到處理列表 我會在tbl1中獲得{3,false} 然後添加3和4到處理 第三圈我會得到{5,false}在tbl1 這是預期的嗎?

如果我在第4圈添加了6個處理過程,我會在下一次出現時再次獲得{5,false}嗎? 再次被這個預期 我想我只是覺得這有點混亂,感覺它的危險,但可能這只是我 - 作爲它的不完全決策意識

ň

+0

我認爲你的直覺是壞的是:-)它應該工作。 –

回答

3

如您遍歷tables它總會查詢processed當前內容...所以它會做你想要什麼,但它不是我會建議做:)

從別的,你可以使用 HashSet<int>避免一O

除了(N )在每次迭代中包含檢查。

不過,我懷疑你想在MoreLINQDistinctBy功能:

foreach (var item in tables.DistinctBy(x => x.Key)) 
{ 
    // Process the item 
} 

這不會離開你處理的按鍵,無可否認的名單......但也許這不是一個問題。

我個人認爲這是一個恥辱,LINQ還沒有DistinctByMaxBy等,但我們去...

0

會分組你的表幫你嗎?

var groups = tables.GroupBy(x=> x.Key); 

根據您的計劃,您可以在內部訂購組。或者我有些錯誤?

0

我覺得你的直覺,這是不好的是正確的:-)

它應該工作,雖然。

where函數在比較它們時產生結果,所以每次迭代它將運行lambda並檢查密鑰是否在列表中。

您還應該將該列表更改爲HashSet以獲得性能。