Unlimited3D недопустимое приведение исключения для словаря - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь реализовать случайную запись из словарной функции, рассматриваемой здесь, в unity3d в visual studio: Случайная запись из словаря .

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 Ответ

3 голосов
/ 12 мая 2019

Код, который у вас есть в 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 случайными, уникальными записями из оригинала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...