2012-03-27 174 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