在哈希表而不是int32中存储int

时间:2013-03-12 00:33:09

标签: hashtable unity3d int32 unityscript

给定两个字符串,比如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中,但对于我将要使用的数学量和键值对的数量,这将是一个非常冗长且不优雅的解决方案,因此大多数否定了首先使用哈希表的好处。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

为什么不在表格中存储hashValintTemp的元组而不仅仅是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;