Используя словарь в общих коллекциях, вам никогда не придется использовать RemoveAt (). Значения ключа в словаре должны быть уникальными.
// Unique Not Unique
// | |
Dictionary<int, string> alphabet = new Dictionary<int, string>();
alphabet.Add(1, "A");
//Adding this will cause an Argument Exception to be thrown
//The message will be: An item with the same key has already been added.
alphabet.Add(1, "A");
Если бы я хотел удалить элемент с ключом 24 из моего примера с алфавитом, это то, что мне нужно:
alphabet.Remove(24)
Это работает, потому что никогда не будет 2 клавиш с одинаковым значением.
Теперь, если вы хотите удалить предмет, не зная его ключа, это другая история. Вам нужно будет пройти через каждый элемент и попытаться найти ключ, связанный с ним. Я бы использовал linq, вроде как:
var key = (from item in alphabet
where item.Value == "K"
select item.Key).FirstOrDefault();
//Checking to make sure key is not null here
...
//Now remove the key
alphabet.Remove(key)
В обоих случаях, как я вижу, никогда не было причины, по которой необходимо удалить RemoveAt (индекс) из любого списка, где значения ключей должны быть уникальными.