给定两个字符串,比如hashKey和hashVal,我将该对添加到哈希对象中。在这个例子中,hashVal是一个表示整数的字符串,因此我在将它存储到表中之前就这样解析它。
现在这是问题所在。存储在散列表中的值实际上是一个int32对象,这使得以后在表达式中使用很麻烦。经过很长时间的观察,我一直无法找到一种简单的方法来存储实际的int或提取存储为int而不是int32对象的值。
以下是我正在尝试做的一个例子:
var myHash : HashObject;
var intTemp : int;
var hashKey : String;
var hashVal : String;
hashKey = "foobar";
hashVal = "123";
if(System.Int32.TryParse(hashVal,intTemp))
{
intTemp = int.Parse(hashVal);
myHash.Add(hashKey,hashVal);
}
// later, attempt to retrieve and use the value:
var someMath : int;
someMath = 456 + myHash["foobar"];
这会产生编译时错误:
BCE0051:操作员'+'不能与'int'类型的左侧和'Object'类型的右侧一起使用。
如果我尝试转换对象,我会得到运行时错误:
InvalidCastException:无法从源类型转换为目标类型。
我知道在使用它之前我可以先将检索到的值存储在新的int中,但对于我将要使用的数学量和键值对的数量,这将是一个非常冗长且不优雅的解决方案,因此大多数否定了首先使用哈希表的好处。
有什么想法吗?
答案 0 :(得分:0)
为什么不在表格中存储hashVal
和intTemp
的元组而不仅仅是hashVal
?然后,您可以直接从查找
if(System.Int32.TryParse(hashVal,intTemp)) {
intTemp = int.Parse(hashVal);
myHash.Add(hashKey, { hashValue : hashVal, intValue : intTemp });
}
var someMath : int;
someMath = 456 + myHash["foobar"].intValue;
答案 1 :(得分:0)
我不熟悉统一脚本中的“HashObject”。你可以使用HashTable吗?:
var myHash: Hashtable;
function Start() {
myHash = new Hashtable();
myHash.Add("one",1);
myHash.Add("two",2);
}
function Update () {
var val = myHash["one"] + myHash["two"] + 3;
Debug.Log("val: " + val);
}
同样在原始示例中,您将字符串值分配给哈希表,从不使用intTemp。
答案 2 :(得分:0)
C# : The easiest hash solution in Unity is the HashSet:
https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx
(You have to include the System.Collections.Generic library)
Very simple usage, O(1) speed
// create - dont even worry setting the size it is dynamic, it will also do the hash function for you :)
private HashSet<string> words = new HashSet<string>();
// add- usually read from a file or in a for loop etc
words.Add(newWord);
// access via other other script such as
if (words.Contains(wordToCheck))
return true;