2012-03-27 228 views
2

我想存儲一個班級內的歐元硬幣的直徑,並使用該班級的方法通過其直徑獲取硬幣的價值(值)。從字典中獲取鍵值對

首先,我不確定在初始化時使用類和構建它的字典是一個好主意或不是如此如果你知道更好的方式,請讓我現在。

其次,我寫的代碼,這個類是這樣的:

class EuroCoinSpecs 
{ 
    public Dictionary<double, decimal> CoinsDiameters; 

    public EuroCoinSpecs() 
    { 
     CoinsDiameters = new Dictionary<double, decimal> 
         { 
          {25.75, 2.00m}, 
          {23.25, 1.00m}, 
          {24.25, 0.50m}, 
          {22.25, 0.20m}, 
          {19.75, 0.10m}, 
          {21.25, 0.05m}, 
          {18.75, 0.02m}, 
          {16.25, 0.01m} 
         }; 
    } 

    public decimal GetValueForDiameter(double diameter) 
    { 
     return CoinsDiameters.FirstOrDefault(x => x.Key == diameter); 
    } 
} 

的問題是在GetValueForDiameter的代碼不會因爲這個錯誤的編譯:

Cannot implicitly convert type 'System.Collections.Generic.KeyValuePair<double,decimal>' to 'decimal' 

我嘗試不同的方法,但它不想工作。可能是什麼問題?

回答

5

其他人已經給出了使用FirstOrDefault進行提取的方式 - 但對我來說這似乎毫無意義。爲什麼不使用事實上,你有一本字典,它被設計來爲你執行關鍵的查找?

public decimal GetValueForDiameter(double diameter) 
{ 
    decimal ret; 
    // This will set ret to 0m if the key isn't found. 
    CoinsDiameters.TryGetValue(diameter, out ret); 
    return ret; 
} 

說了這一切,我會強烈建議你不要這樣double值進行平等的操作。在你提供的情況下,它會工作正常,但只要你開始使用任何算術,你最終可能會導致問題。

4

FirstOrDefault(x => x.Key == diameter)從詞典中選擇一個項目,這是一個KeyValuePair。該方法預計返回decimal

您必須返回值或所選對。事情是這樣的:

所有的
return CoinsDiameters.FirstOrDefault(x => x.Key == diameter).Value; 
2

首先,你要FirstOrDefault調用返回KeyValuePair<double, decimal>。你需要返回Value屬性:

return CoinsDiameters.FirstOrDefault(x => x.Key == diameter).Value; 

其次,初始化列表是在這種情況下細,但我會考慮在配置文件中存儲這些數據,並在運行時閱讀它(使將來的更新不需要重新編譯)。

第三,直徑真的是獨一無二的嗎?如果您重複一個鍵:

  1. 您的初始化列表將失敗,因爲它會調用Add;你不能Add相同的鍵兩次到dictinoary
  2. 你在字典中失去了以前的值(如果你不使用Add,但索引的setter)

如果是這樣的話,可以考慮使用Dictionary<double, List<decimal>>。如果以這種方式對它們進行分組,請考慮對每個組進行包裝以使您的代碼更具可讀性。

class CoinGroup { public double Diameter {...} public ICollection<Coin> Coins { ... } } 

這種方式,你可以給有關硬幣更多的元數據,以及(在​​類)

class Coin { public string Local {...} public decimal Value {...} } 

只是一些想法我了。

1

這更多的是一個答案到你的「這是一個好主意,」查詢比你的實際,螺母和螺栓代碼問題:

就個人而言,我會建議你做一個名爲硬幣型,有一個雙屬性和一個十進制屬性。這只是一個溫和的例子,但是作爲基元的特定集合管理概念的趨勢是稱爲「原始癡迷」的代碼氣味。

如果您製作硬幣類型,您可以保留一個列表或枚舉或其他比字典更容易維護和使用的東西。

+0

謝謝,你說的是真的如果在歐洲只有8種類型的硬幣! – 2012-03-27 18:52:00

+0

這不是一個有多少類型的問題,而是多少類型的屬性。想象一下,如果您決定爲硬幣的重量再加上一個小數,併爲其製成的材質枚舉。突然之間,你的字典表示正在膨脹成三個平行的字典(或某物)。這是你用這種方式維護原始元素時所遇到的滑坡。 – 2012-03-27 18:54:49