双值字典,返回特定键的任何值

ZAA*_*ZAA 2 c# dictionary probability

我需要创建一个每个键有2个值的字典,它必须以相同的概率返回2个值中的一个.

例:

myDicry
{
  key = "A", value1=15, value2=56;
}

int firstCall = myDicry["A"];  // = 15
int secondCall = myDicry["A"]; // = 56
Run Code Online (Sandbox Code Playgroud)

Ani*_*Ani 9

编写一个IDictionary<TKey, TValue>以这种方式运行的实现是可能的,但这不是一个好主意:大多数人会发现集合类的非确定性索引器非常不直观.

相反,我建议你把它作为键的的责任,而不是词典本身.一种选择是编写一种能够以相同的概率从一组可能性中挑选的自定义类型.例如:

public class UnbiasedRandomPicker<T>
{
    private readonly Random _rand = new Random();
    private readonly T[] _possibilities;

    public UnbiasedRandomPicker(params T[] possibilities)
    {
        // argument validation omitted
        _possibilities = possibilities;
    }

    public T GetRandomValue()
    {
        return _possibilities[_rand.Next(_possibilities.Length)];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用字典:

var dict = new Dictionary<string, UnbiasedRandomPicker<int>>
{
    {"A", new UnbiasedRandomPicker<int>(15, 56)},
    {"B", new UnbiasedRandomPicker<int>(25, 13)}
};

int randomValueFromA = dict["A"].GetRandomValue();
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

框架中没有内置任何东西,但你可能想要通过创建一个"包装"类型来实现它Dictionary<TKey, Tuple<TValue, TValue>>.然后,您将编写一个索引器,以便在两个值之间进行适当选择.