2010-05-10 54 views
4

我有Dictionary<string,int>,我只是想將字典中的值減1。遞減字典中的所有int值

我有這個,但不知道,如果它的最佳做法。

foreach (KeyValuePair<string, int> i in EPCs) 
{ 
    EPCs[i.Key] = i.Value - 1; 
} 

更新:我試圖減少數值的原因是becase的價值是與位置的索引號。當我從字典中刪除某些東西時,我必須在字典中減少該索引號。可能有更好的方法。

+2

這是一件奇怪的事情要做。你能描述你在做什麼,爲什麼?也許有一種比字典更合適的數據結構。特別是,我注意到這似乎非常昂貴;如果字典很大,那麼你正在做很多改變。有數據結構可以更有效地支持這些操作。 – 2010-05-10 16:12:00

回答

2

我認爲這是完全合適的。

但是既然你問了這個問題,你擔心這種代碼可能不合理?

你應該意識到,你有兩種選擇,做你在找什麼,或者:

  1. 修改現有的字典訪問的每個條目(你的代碼一樣),或
  2. 創建一個帶有你想要的計算值的新字典。

你可以用LINQ做第二個容易:

var newDict = myDict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value-1); 
+0

我很好奇,爲什麼這是被接受的答案,因爲它包含與我的答案相同的信息,而答案是幾分鐘或更長時間的投票? – 2010-05-10 15:35:13

+0

我已經刪除它,因爲當我運行代碼我得到了有關被修改的集合的異常,因此我猜我的代碼是不正確的,因爲兩個答案都表明。 – Jon 2010-05-11 07:46:19

0

你可以寫一個小的,每個枚舉自己,採取行動並執行它的每一個元素:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
    { 
     foreach (T element in source) 
     { 
      action(element); 
     } 
    } 

使用這樣的:

EPCs.ForEach(x => EPCs[x.Key] = x.Value -1); 

不準時除了你以前的任何更清潔,但更緊湊一點。 Reactive Extensions在System.Interactive中有一個類似的運算符,名爲Do

+1

'KeyValuePair'是隻讀類型。您不能以這種方式修改內容。 – 2010-05-10 15:12:29

+0

這不起作用。 KeyValuePair的'Value'屬性沒有setter - 你不能以這種方式分配給字典。 – LBushkin 2010-05-10 15:12:30

+0

是的,修好了。我沒有完全複製粘貼他的代碼,因此錯過了它;-) – 2010-05-10 15:14:25

5

您現有的代碼是遞減字典中所有值的完全適當的方式。

如果你想創建一個新的字典,你可以使用LINQ:

EPCs = EPCs.ToDictionary(p => p.Key, p => p.Value - 1); 

然而這將創建一個完全Dictionary<string, int>實例,而不是就地修改現有的實例。但是,由於您用linq標記了您的問題,我想我會提供一種方式(我知道),LINQ可以解決您的問題。

+0

LINQ操作工作在不可變類型上,所以你沒有辦法在沒有創建新詞典的情況下用LINQ來完成它。 – 2010-05-10 15:15:22

+1

@BlueRaja:我認爲說LINQ操作不是用來修改現有的枚舉*更爲正確。 LINQ中沒有任何東西使它對不可變類型的處理方式與對可變類型的處理方式不同。 – 2010-05-10 15:22:23

0

你的代碼是完全沒有考慮到的情況下(Dictionary<string,int>).

如果你需要使用的東西比字典還可能是從長遠來看是更好的選擇高性能。

2

這不是一個直接的答案,但不是爲每個項目遞減它,而是隻需存儲一個偏移量,並在獲取某個項目時即時將其減少,無論是作爲專門類還是僅在代碼中。

+0

而運行時複雜性獎去...... ;-) – efi 2010-05-11 07:47:16

相關問題