Accessing float from dictionary

Hi Unity Community

I am using the generic dictionary to store a string [key] and a float [value], however I can’t seem to access it the float value by passing the string key.

I am sure the float values are present as they return properly when iterated over using the the key value pairs, so I must be trying to access the value wrong; can anyone enlighten me as to where this issue may be occurring?

Have tried a whole number of approaches available in reference documentation to no avail.

Many thanks in advance,
Ryan

Dictionary declaration:

	groupingsOrigin = new Dictionary.<String, float>();
	
	for (var group : String in groupings)
	{	
		var subDivLength = floorSizeX - floorSubdivisionSize;
		floorSizeX -= floorSubdivisionSize; 
		var subDivXOrigin = subDivLength + (floorSubdivisionSize/2);
		groupingsOrigin.Add(group, subDivXOrigin);
	}

Debugs correct:

for (var group : KeyValuePair.<String, float> in groupingsOrigin)
	{
		var groupOrigin = groupingsOrigin.Values;
		Debug.Log("Dictionary entry= " + " Group Name: " +group.Key + " " + " Group X Origin: " + group.Value);
	
	}

**Value retrieval issue: ** (‘curSortField’ being synonymous w/ the key string)

var curObjXPos : float = groupingsOrigin[curSortField]; //value of objSort dict matches the key of the groupingsOrigin dict
		
//		var curObjXPos : float;
//		groupingsOrigin.TryGetValue(curSortField, curObjXPos);

Issue returns:

CurObj moving to: CompilerGenerated.__BrowseImpSortPositionObj_positionObjects$callable1$137_61__
UnityEngine.Debug:Log(Object)
BrowseImpSortPositionObj:positionObjects(Dictionary`2) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:137)
BrowseImpSortPositionObj:getPhotogramLocations(List`1) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:83)
BrowseImpSortPositionObj:sortMode(List`1) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:39)
$:MoveNext() (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImportObj.js:132)

Question Update

Full script being used:

#pragma strict

//function used to sort imported objs by their sort field and position them in groups

import System.Linq;
import System.Xml;
import System.Collections.Generic;

var infoCont : ObjInfoControl;

//xml declarations
var xmlRoot : XmlNode;

//gui dependancies
var photogramLocationToggle : Toggle;
var floorPlane : GameObject; //floorplane objects sit on

var curPosObjects : List.<GameObject>;
var groupingsOrigin = Dictionary.<String, float>();


function sortMode(curBrowseObjects : List.<GameObject>) //determines what sort of sorting is requried
{
	curPosObjects = curBrowseObjects;

	if (photogramLocationToggle.isOn)
	{
		getPhotogramLocations(curPosObjects);	
	}	
}


//Photogram etc might need their own script
function getPhotogramLocations (curPosObjects : List.<GameObject>) //used to determine number of locations in browse results
{
	xmlRoot = infoCont.control.root;

	var curObjName : String;

	var objectPhotogramLocations : List.<String>  = new List.<String>(); //will be used to count up number of locations in browse results
	
	var objectLocationsDict = new Dictionary.<GameObject, String>();
	
	Debug.Log("Positioning now");
	for (var object : Object in curPosObjects)
	{
	
		var curObject = object as GameObject;
		curObjName = curObject.name;
		Debug.Log("Positioning: " + curObjName);
		
		var curObjNode = xmlRoot.SelectSingleNode("MetaPipeObject[@name='"+ curObjName +"']");
		var curLocationName = curObjNode.SelectSingleNode("./ModelInfo/PhotogramInfo/PhotogramLocation/PhotogramLocationName").InnerText;
		Debug.Log(curObjName + " location: " + curLocationName);	
		
		objectLocationsDict.Add(curObject, curLocationName);
		
		if (!objectPhotogramLocations.Contains(curLocationName)) //will only add location name to list if it doesn't already exist
		{
			objectPhotogramLocations.Add(curLocationName);
		}
	}
	
	//sort the photogram groups reverse alphabetically to match origin calculations
	objectPhotogramLocations = objectPhotogramLocations.OrderByDescending(function(curObjName) curObjName).ToList();
	
	var photogramLocationCount : int = objectPhotogramLocations.Count;
	Debug.Log("Total number of locations: " + photogramLocationCount);
	
	findXOrigin(photogramLocationCount, objectPhotogramLocations); //find floor allocations for the individual groupings
	
	positionObjects(objectLocationsDict); //move the objects into position
}


function findXOrigin(numberOfGroupings : int, groupings : List.<String>)
{
	var floorPlaneCol = floorPlane.GetComponent(BoxCollider);	
	var floorSizeX = floorPlaneCol.size.x;
	Debug.Log("floorSizeX: " + floorSizeX);
	
	var floorSubdivisionSize = floorSizeX / numberOfGroupings;
	Debug.Log("floorSubdivisionSize: " + floorSubdivisionSize);
	
	groupingsOrigin = new Dictionary.<String, float>();
	
	for (var group : String in groupings)
	{	
		var subDivLength = floorSizeX - floorSubdivisionSize;
		floorSizeX -= floorSubdivisionSize; //removes accounted for section from the overall size
		var subDivXOrigin = subDivLength + (floorSubdivisionSize/2);
		groupingsOrigin.Add(group, subDivXOrigin);
	}
	
	//Accessing values example
	for (var group : KeyValuePair.<String, float> in groupingsOrigin)
	{
		var groupOrigin = groupingsOrigin.Values;
		Debug.Log("Dictionary entry= " + " Group Name: " +group.Key + " " + " Group X Origin: " + group.Value);
	
	}
	
	for (var group : String in groupingsOrigin.Keys)
	{
		var groupOriginX = groupingsOrigin[group];
		Debug.Log("Dictionary entry= " + " Group Name: " + group + " " + " Group X Origin: " + groupOriginX.ToString);
	}
}


function positionObjects(objectSortDict : Dictionary.<GameObject, String>)
{
	//assigns rb/coll components and moves objects into position
	
	//var groupingsOrigin = Dictionary.<String, float>()
	
	for (var browseObj : KeyValuePair.<GameObject, String> in objectSortDict)
	{
		var curObj : GameObject = browseObj.Key;
		var curSortField : String = browseObj.Value;
		Debug.Log("Dictionary entry= " + " Object Name: " + curObj.name + " " + " Location: " + curSortField);
		
		var curObjXPos : float = groupingsOrigin[curSortField]; //value of objSort dict matches the key of the groupingsOrigin dict
		
//		var curObjXPos : float;
//		groupingsOrigin.TryGetValue(curSortField, curObjXPos);
		
		curObj.transform.position.x = curObjXPos;
		Debug.Log("CurObj moving to: " + curObjXPos.ToString);
	}

}

Just a guess, but object is a reserved keyword in most languages. You should try replacing your variable name with something else:

for (var myObject : KeyValuePair.<GameObject, String> in objectSortDict) {

    var curObj : GameObject = myObject.Key;
    var curSortField : String = myObject.Value;
  ....

Turns out the issue was being caused by an incorrect Debug.Log where .ToString was trying to be parsed in debugging sequences such as in:

Debug.Log("Dictionary entry= " + " Group Name: " + group + " " + " Group X Origin: " + groupOriginX.ToString);

Not the actual dictionary references themselves.

Cheers,
Ryan