Как удалить элемент из определенного места в словаре в C #? - PullRequest
1 голос
/ 04 декабря 2009

У меня есть база данных «Словарь», и я хочу вернуть элемент из определенного места. Я видел, что есть функция "ElementAt", но мне не удалось ее использовать.

Почему что-то подобное не работает?

closeHash.ElementAt<State>(i);

это говорит мне следующую ошибку:

Ошибка 3 «System.Collections.Generic.Dictionary» не содержит определения «ElementAt» и лучшая перегрузка метода расширения «System.Linq.Queryable.ElementAt (System.Linq.IQueryable, int)» имеет некоторые недействительные аргументы

И этот код также не работает, потому что closeHash [i] дает мне только индекс, а не фактический элемент:

   if (closeHash.ContainsKey(i) && ((State)closeHash[i]).getH() + 
((State)closeHash[i]).getG() > checkState.getH() + checkState.getG()

Каждый элемент в Словаре имеет класс «State», и checkState также является State, имеющим функции GetH и GetG. Я хочу вынуть элемент на I-й позиции и поработать с ним, а не просто удалить его.

спасибо заранее!

Грег

Ответы [ 5 ]

4 голосов
/ 04 декабря 2009

Используя словарь в общих коллекциях, вам никогда не придется использовать 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 (индекс) из любого списка, где значения ключей должны быть уникальными.

3 голосов
/ 04 декабря 2009

Как насчет использования функции Remove и передачи в ElementAt?

        Dictionary<int, string> closeHash = new Dictionary<int, string>();
        closeHash.Add(47, "Hello");
        closeHash.Remove(closeHash.ElementAt(0).Key);
1 голос
/ 04 декабря 2009

Я уверен, что вы можете сделать это как-нибудь, но коллекции типов хеш-таблиц обычно не работают с понятием «порядок». В Java вы можете получить Enumerator или Iterator и удалить n-ный элемент, с которым вы столкнетесь, но, опять же, я не думаю, что это имеет смысл.

0 голосов
/ 04 декабря 2009

В сообщении об ошибке указывается, что ваша переменная closeHash - это словарь, по-видимому, словарь <"type of i", State>. Если нет, укажите точное объявление словаря и «i».

Затем closeHash [i] должен дать значение типа State, так что вам не нужно приводить.

Как уже говорили другие, в словаре нет понятия "порядок" и, следовательно, нет "n-го элемента".

0 голосов
/ 04 декабря 2009

Вам просто нужно использовать System.Linq, чтобы иметь возможность использовать метод расширения ElementAt <>. Включите это в начало объявления класса:

using System.Linq;

И это должно сработать.

...