Hashtable Bejeweled movement

I have a field with cubes generated from a hash table like bejeweled.
When i click a cube, the cube is being removed from the hash table and i remove the object.

I want the cubes above the just removed cube to move down.

This is the code i have:

My code is a bit of a mess because i couldn’t remove a key from the hash table in a for each loop.
The method remove adds all the id’s from the selected cubes to a array list. after that is done the Removegroup function removes the cubes from the hash table.

After that the MoveDown function is called. It adds all the cubes without a cube underneath (exept the bottom row) to a array lists and the method remove, moves all that cubes a position down and calls MoveDown again.

I think the problem is in the Remove function (renaming the cubes position in the hash table)

public Hashtable cubes;

	public void Remove ()
{
	verwijderGroep.Clear ();
	foreach (string id in cubes.Keys) 
	{
		GameObject blokje = (GameObject)cubes[id];
		if (blokje.GetComponent<Cube> ().isSelected == true)
		{
			verwijderGroep.Add (id);
			Destroy (blokje);
		}
	}
	RemoveGroup (verwijderGroep);
}

public void RemoveGroup (IEnumerable verwijder)
{
	foreach (string id in verwijder)
	{
		cubes.Remove (id);
	}	
}

public void Verplaats ()
{
	foreach (string id in verwijder) 
	{
		blokje2 = (GameObject)cubes[id];
		Vector3 underCube = new Vector3 (blokje2.transform.position.x, blokje2.transform.position.y - 1, blokje2.transform.position.z);
		cubes.Remove (id);
		cubes.Add (underCube.ToString (), blokje2);
		
		iTween.MoveTo (blokje2, new Vector3 (blokje2.transform.position.x, blokje2.transform.position.y - 1, 0), 1);	
	}
	MoveDown ();
}


public int nogverkeerd = 0;

public void MoveDown ()
{
	nogverkeerd = 0;
	verwijder.Clear ();
	foreach (string id in cubes.Keys) 
	{
		GameObject blokje = (GameObject)cubes[id];
		Vector3 underCube = new Vector3 (blokje.transform.position.x, blokje.transform.position.y - 1, blokje.transform.position.z);
		if (!cubes.Contains (underCube.ToString ()) && blokje.transform.position.y != 0.0) 
		{
			verwijder.Add (id);
			nogverkeerd = 1;
			//Debug.Log (id);
		}
	}
	if (nogverkeerd == 1)
		Verplaats ();
}

Thanks

It would simplify things a huge amount if you used a 2D array instead of a hashtable.