我有一个“词典”数据库,我想从特定位置返回一个元素。我看到有“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位置取出元素并对其进行处理,而不仅仅是删除它。
提前感谢!
格雷格
答案 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项”的概念。