2014-12-03 50 views
1

如何獲得在所選擇的(的foreach)先前元件一些這樣dic[index -1].Key字典LINQ選擇先前

new Dictionary<int, double>(); 

dic.Select(x => x.Value*(x.Equals(dic.FirstOrDefault()) ? x.Key : //x.Key - dic[index -1].Key//)).Sum() 
+2

字典無序。 'FirstOrDefault()'在這裏無法正常工作。 – SLaks 2014-12-03 15:25:30

+0

你能擴展你的答案並告訴我們爲什麼你需要這樣做嗎?它會幫助我們幫你 – 2014-12-03 15:25:35

+0

字典沒有訂單。如果你使用了'OrderedDictionary',那麼'foreach'可能會更清潔,因爲你需要跟蹤「最後一個」鍵。 – 2014-12-03 15:26:04

回答

3

Select方法提供了一個索引作爲第二參數。

dic.Select((x, index) => dict[index]) 

如果你想選擇一個索引的元素,你可以使用ElementAt

dic.Select((x, index) => dic.ElementAt(index).Key) 
+1

以及如何你會用這個問題嗎? 'dict [index]'不會選擇「第n個」項;它會返回'index'是關鍵字的值。 – 2014-12-03 15:28:05

+0

但是如何訪問密鑰,因爲字典[索引]。(僅限數值) - 我的字典包含例如:23,10.00; 150,56.7;我需要得到確切的關鍵 – AleksP 2014-12-03 15:34:14

+0

@AleksP我已經更新了答案。事實上,我認爲只需要一個普通的'for'循環就可以輕鬆完成。 – 2014-12-03 15:36:35

0

如果使用OrderedDictionary那麼它可能會更快地使用直foreach

double sum = 0.0; 
int prev = 0; 
foreach(var kvp in dic) 
{ 
    sum += kvp.Value * (kvp.Key - prev); 
    prev = kvp.Key; 
} 

在任何情況下,我會首先想出工作然後重新構成如果你能使它更好更好。 「更好」可能不會使用Linq;在大多數情況下,難以理解和調試的令人費解的Linq查詢比干淨,高效的循環更糟糕。