如何从C#中的Dictionary中的特定位置删除元素?

时间:2009-12-04 12:58:27

标签: c# hash dictionary element

我有一个“词典”数据库,我想从特定位置返回一个元素。我看到有“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()

Dictionary中的每个元素都是一个“State”类,checkState也是一个具有GetH和GetG函数的State。我想在Ith位置取出元素并对其进行处理,而不仅仅是删除它。

提前感谢!

格雷格

5 个答案:

答案 0 :(得分:4)

在Generic集合中使用Dictionary,您永远不必使用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(索引)。

答案 1 :(得分:3)

如何使用Remove函数并传入ElementAt?

        Dictionary<int, string> closeHash = new Dictionary<int, string>();
        closeHash.Add(47, "Hello");
        closeHash.Remove(closeHash.ElementAt(0).Key);

答案 2 :(得分:1)

我确信你能以某种方式做到这一点,但哈希表类型集合通常不会对“order”的概念起作用。在Java中,您可以获得一个Enumerator或Iterator并删除您遇到的第n个项目,但同样,我认为这没有意义。

答案 3 :(得分:0)

您只需要使用System.Linq就可以使用ElementAt&lt;&gt;扩展方法。在类声明的开头包含这个:

using System.Linq;

这应该可以解决问题。

答案 4 :(得分:0)

错误消息表明你的变量closeHash是一个Dictionary,显然是一个Dictionary&lt;“type of i”,State&gt;。如果没有,请说明字典的确切声明和“i”。

然后closeHash [i] 应该给出一个State类型的值,所以你不需要强制转换。

正如其他人所说,词典没有“秩序”的概念,因此没有“第n项”的概念。