Можно было бы написать реализацию 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)];
}
}
Вы можете использовать словарь так:
var dict = new Dictionary<string, UnbiasedRandomPicker<int>>
{
{"A", new UnbiasedRandomPicker<int>(15, 56)},
{"B", new UnbiasedRandomPicker<int>(25, 13)}
};
int randomValueFromA = dict["A"].GetRandomValue();