данный ключ отсутствует в словаре

646
26 декабря 2016, 22:25

Выдает ошибку "данный ключ отсутствует в словаре" при нажатии на Q,W... работают только клавиши от D1 до D0 и backsapace. Вопрос: почему выдает ошибку, вроде же верно все?

public enum Notes
{
    Do1, Re1, Mi1, Fa1, Col1, La1, Si1,
    Do2, Re2, Mi2, Fa2, Col2, La2, Si2,
    Do3, Re3, Mi3, Fa3, Col3, La3, Si3,
    Do4, Re4, Mi4, Fa4, Col4, La4, Si4,
    Do5, Re5, Mi5, Fa5, Col5, La5, Si5, Do6,
    DoSharp1, ReSharp1, FaSharp1, ColSharp1, LaSharp1,
    DoSharp2, ReSharp2, FaSharp2, ColSharp2, LaSharp2,
    DoSharp3, ReSharp3, FaSharp3, ColSharp3, LaSharp3,
    DoSharp4, ReSharp4, FaSharp4, ColSharp4, LaSharp4,
    DoSharp5, ReSharp5, FaSharp5, ColSharp5, LaSharp5
}
private Dictionary<Notes, MediaPlayer> sounds = new Dictionary<Notes, MediaPlayer>();
private Dictionary<Keys, bool> pressStates = new Dictionary<Keys, bool>();
private Dictionary<Keys, Notes> KeySounds = new Dictionary<Keys, Notes>
{
    { Keys.D1, Notes.Do1 },
    ....
    //для каждой ноты перечисления Notes задаем клавишу клавиатуры
    ....
    { Keys.NumPad9, Notes.LaSharp5 }
};
private void Form1_Load(object sender, EventArgs e)
{
    //Инициализируем словари
    foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
    {
        sounds.Add(s, new MediaPlayer());
        pressStates.Add((Keys)s, false);
    }
    //Наполняем словарь звуками
    sounds[Notes.Do1].Open(new Uri("s//_1.wav", UriKind.Relative));
    ....
    //Для каждой ноты задаем звуковой файл
    ....
    sounds[Notes.LaSharp5].Open(new Uri("s//25.wav", UriKind.Relative));
}
private void Form1_KeyDown(Object sender, KeyEventArgs e)
{       
    if (!KeySounds.ContainsKey(e.KeyCode)) return;
    if (!pressStates[e.KeyCode])
    {
        pressStates[e.KeyCode] = true;
        PlaySound(KeySounds[e.KeyCode]);
    }  
}
private void Form1_KeyUp(Object sender, KeyEventArgs e)
{        
    if (!KeySounds.ContainsKey(e.KeyCode)) return;
    if (pressStates[e.KeyCode])
    {
        pressStates[e.KeyCode] = false;
        StopSound(KeySounds[e.KeyCode]);
    }             
}
Answer 1

Ошибка тут:

//Инициализируем словари
foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
{
    sounds.Add(s, new MediaPlayer());
    pressStates.Add((Keys)s, false);
}

Значения из перечисления Notes могут быть приведены к значениям Keys, потому что оба перечисления основаны на типе int. Компилятор считает что вы понимаете что делаете, раз используете явное приведение и оно может быть выполнено без ошибок. Однако это ни коим образом не гарантирует, что числовые коды ваших нот будут совпадать с кодами клавиш. которые вы хотите использовать.

Для исправления, разделите на два независимых цикла, например так:

//Инициализируем словарь нот
foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
{
    sounds.Add(s, new MediaPlayer());
}
//Инициализируем словарь состояний клавиш
foreach (Keys k in KeySounds.Keys)
{
    pressStates.Add(k, false);
}

или можно даже в одном цикле, но тогда вот так:

//Инициализируем словари
foreach (var s in KeySounds)
{
    sounds.Add(s.Key, new MediaPlayer());
    pressStates.Add(s.Value, false);
}
READ ALSO
Unity. Загрузка спрайтов пользователем

Unity. Загрузка спрайтов пользователем

Возможно ли разработать приложение, которое предложит поля для загрузки собственных спрайтов пользователю? При загрузке спрайтов, они "привязываются"...

834
количество загруженных документов c#

количество загруженных документов c#

В dataGridView загружаются документы Word

332
C# Файлы, отображаемые в память

C# Файлы, отображаемые в память

Будет ли работать данная технология при передачи данных из/в приложение C# windows и Ubuntu находящейся внутри Virtual Box

488
Рендер UI элементов асинхронно

Рендер UI элементов асинхронно

Есть тяжелый UI внутри окна, пока он рендерится зависает все окно, как можно рендерить UI асинхронно, при этом не блокируя весь UI окнаМои мысли...

350