我正在实现一个扩展方法,TKey
它IDictionary<TKey, TValue>
作为参数返回。如果TValue
是double
,则该方法可能会返回TKey
具有最高值的 a。否则,它将随机返回一个TKey
.
public static TKey Sample<TKey>(this IDictionary<TKey, double> probabilityTable, Random r)
{
probabilityTable.Normalize();
var roll = r.NextDouble();
var temp = 0.0;
foreach (var key in probabilityTable.Keys)
{
temp += probabilityTable[key];
if (roll <= temp)
return key;
}
return default(TKey);
}
public static TKey Sample<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, Random r)
{
return dictionary.Skip(r.Next(dictionary.Count)).FirstOrDefault().Key;
}
public static IDictionary<TKey, double> Normalize<TKey>(this IDictionary<TKey, double> probabilityTable)
{
if (probabilityTable.Any(x => x.Value < 0))
throw new ArgumentOutOfRangeException("probabilityTable", "Probability is expected to be positive.");
var sum = probabilityTable.Sum(x => x.Value);
if (Math.Abs(sum - 1) > 1e-8)
return probabilityTable.ToDictionary(x => x.Key, x => x.Value / sum);
if (Math.Abs(sum) < 1e-8)
return probabilityTable.ToDictionary(x => x.Key, x => 1.0 / probabilityTable.Count);
return probabilityTable;
}
问题是即使使用ofSample<TKey, TValue>
也总是调用它。我可以用 where 子句指定类型exclude double 的任何方式吗?IEdouble
TValue
TValue
where TValue: !double
调用扩展函数的代码如下:
var r = new Random();
var pt = new Dictionary<char, double> {{'A', 0.1}, {'B', 0.2}, {'C', 0.7}};
var ct = new Dictionary<char, char> {{'A', 'D'}, {'B','E'}, {'C', 'F'}};
Console.WriteLine(pt.Sample(r)); // expected to return 'C' mostly but uniformly returns key
Console.WriteLine(ct.Sample(r));