раз сетка была созданный размер останется неизменным (все сетки будут одинакового размера), а объект, связанный с каждой ячейкой, не будет изменение
Тогда тем более эффективным будет многомерный массив:
// Creates array
Cell[,] array = new Cell[20, 50];
// Access to items (get item by X/Y indexes)
array[10, 12] = ...;
Удивление, как Cell [,] сравнивает словарю, Cell> подход
Cell[,]
Безразлично Не нужно выполнять поиск HashTable
каждый раз, когда вы хотите получить доступ к элементу, поэтому он более эффективен.Давайте писать некоторые тесты, чтобы дать некоторые идеи (обратите внимание, что это, вероятно, не самый лучший тест можно было бы написать, но, по крайней мере, это дает некоторые идеи):
internal class Program
{
private static void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
int[,] array = null;
for (int i = 0; i < 1000; i++)
{
array = ArrayInit();
}
sw.Stop();
Console.WriteLine("ArrayInit: {0}", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
Dictionary<Tuple<sbyte, sbyte>, int> dic = null;
for (int i = 0; i < 1000; i++)
{
dic = DictionaryInit();
}
sw.Stop();
Console.WriteLine("DictionaryInit: {0}", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
int res;
for (int i = 0; i < 1000000; i++)
{
res = ArrayLookup(array);
}
sw.Stop();
Console.WriteLine("ArrayLookup: {0}", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++)
{
res = DictionaryLookup(dic);
}
sw.Stop();
Console.WriteLine("DictionaryLookup: {0}", sw.ElapsedMilliseconds);
Console.Read();
}
private static int[,] ArrayInit()
{
int[,] array = new int[50, 50];
for (sbyte x = 0; x < 50; x++)
{
for (sbyte y = 0; y < 50; y++)
{
array[x, y] = x * y;
}
}
return array;
}
private static int ArrayLookup(int[,] array)
{
return array[12, 12];
}
private static int DictionaryLookup(Dictionary<Tuple<sbyte, sbyte>, int> dic)
{
return dic[new Tuple<sbyte, sbyte>(12, 12)];
}
private static Dictionary<Tuple<sbyte, sbyte>, int> DictionaryInit()
{
Dictionary<Tuple<sbyte, sbyte>, int> dic = new Dictionary<Tuple<sbyte, sbyte>, int>();
for (sbyte x = 0; x < 50; x++)
{
for (sbyte y = 0; y < 50; y++)
{
Tuple<sbyte, sbyte> t = new Tuple<sbyte, sbyte>(x, y);
dic[t] = x * y;
}
}
return dic;
}
Результаты:
ArrayInit: 25
DictionaryInit: 528
ArrayLookup: 7
DictionaryLookup: 326
В зависимости от ваших потребностей (могут ли размеры меняться после инициализации «сетки?»), Вы можете использовать эффективный 2-мерный массив – ken2k
Я бы сделал 'Cell [,]', разрешив массив координаты - координаты ячейки. –
после того, как сетка была создана, размер останется неизменным (все сетки будут одного размера), и объект, связанный с каждой ячейкой, не изменится. –