编写一个引用静态泛型集合的通用方法?

时间:2014-06-13 19:26:43

标签: c# generics design-patterns concurrency

我必须编写一个接受参数字符串,int,short,long,float或double的方法,然后为该参数指定一个随机值并将其存储在静态ConcurrentDictionary中。性能是一个主要的限制因素,因此我不想采用会牺牲性能的设计

示例:

public void StoreVal<T>(T val)
{
   //Check if the val is already in the respective dictionary

   //If not, then create a random value 

   //Store both values in the dictionary
}

我为我期待的每种数据类型创建了一个静态ConcurrentDictionary。我现在面临的关键问题是如何在泛型方法中引用正确的集合类型,而不必使用一大堆if / else语句?

更新:我使用的是ConcurrentDictionary,因为这个方法将被8个线程调用(至少),我必须确保传递的参数只有一个映射值。另一个限制是每个数据类型应该具有它自己的映射,即10(int) - &gt; 25(int),然后10(短)不需要指向25(短) - 这就是我为每种数据类型创建一个单独的ConcurrentDictionary的原因。

3 个答案:

答案 0 :(得分:3)

如果性能至关重要且如果可能的输入类型集受限且已知,请考虑使用函数重载而不是通用函数:

public void StoreVal(int val) { // no if needed, you know which Dictionary to use }

public void StoreVal(float val) { // no if needed, you know which Dictionary to use }

public void StoreVal(double val) { // no if needed, you know which Dictionary to use }

// etc ... 

其他解决方案必须使用分支,演员表或某种形式的拳击,这无论如何都会降低你的表现。

答案 1 :(得分:1)

您只需致电GetOrAdd即可添加值(如果该值尚未存在):

private ConcurrentDictionary<object, object> dictionary;
public void StoreVal<T>(T val)
{
    dictionary.GetOrAdd(val, _ => ComputeRandomValue());
}

答案 2 :(得分:0)

我的建议是为每个类型(int,long,short,float和double)创建重载。他们是所有价值类型,因此,没有任何共同的祖先。

这就是为什么您在基类库中找到的许多方法都会提供这些重载的原因。

您的方法的签名将接受任何类型的参数,即使它只能处理它们的一小部分。这打破了principle of least surprise