我正在尝试从此处考虑的字典函数实现随机输入到Visual Studio Random entry from dictionary中的unity3d中。
private void somefunction() {
Dictionary<string, Sprite> dict = (Dictionary<string, Sprite>) RandomValues(slotImages).Take(5);
foreach (KeyValuePair<string, Sprite> keyValue in dict)
{
Debug.Log("random slotImages name : " + keyValue.Key);
}
}
public IEnumerable<TValue> RandomValues<TKey, TValue>(IDictionary<TKey, TValue> dict)
{
System.Random rand = new System.Random();
List<TValue> values = Enumerable.ToList(dict.Values);
int size = dict.Count;
while (true)
{
yield return values[rand.Next(size)];
}
}
但是我遇到以下错误;
InvalidCastException: cannot cast from source type to destination type.
答案 0 :(得分:3)
您当前在RandomValues
中拥有的代码返回字典中的随机值列表,而不是实际的字典条目,即键/值对。本质上,您正在尝试将IEnumerable
强制转换为Dictionary
,这不能隐式完成。
以下代码应执行您想要的操作:
public IDictionary<TKey, TValue> RandomValues<TKey, TValue>(IDictionary<TKey, TValue> dict, int count)
{
if (count > dict.Count || count < 1) throw new ArgumentException("Invalid value for count: " + count);
Random rand = new Random();
Dictionary<TKey, TValue> randDict = new Dictionary<TKey, TValue>();
do
{
int index = rand.Next(0, dict.Count);
if (!randDict.ContainsKey(dict.ElementAt(index).Key))
randDict.Add(dict.ElementAt(index).Key, dict.ElementAt(index).Value);
} while (randDict.Count < count);
return randDict;
}
请注意,现在您需要输入想要作为参数的条目数。返回值将是一个字典,其中有count
个随机的,与原始记录唯一的条目。