unity3d字典的无效强制转换异常

时间:2019-05-11 23:19:38

标签: c# dictionary unity3d

我正在尝试从此处考虑的字典函数实现随机输入到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.

1 个答案:

答案 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个随机的,与原始记录唯一的条目。