Привет, коллеги-программисты. Таким образом, у меня есть структура, и у вас есть 3 разных 3D-массива, чтобы их хранить. Дело в том, что оптимизация не является моей специальностью, и мне нужен совет от кого-то, кто знает их вещи относительно наилучших способов хранения и доступа к многомерным массивам структур , Мне нужно знать, есть ли какой-либо из этих методов с точки зрения использования памяти или скорости доступа и т. Д. По сравнению друг с другом. Есть ли еще лучший способ хранения и доступа к структуре, кроме массивов, о которых я не знаю? В основном я использовал https://msdn.microsoft.com/en-us/library/2s05feca.aspx и другие столбцы переполнения стека для справки.C# лучший способ доступа к 3D-массиву структур
Я знаю, что производительность и использование памяти, вероятно, незначительны, когда дело доходит до небольших наборов данных, но причина, по которой я публикую здесь, состоит в том, что я знаю, что в конечном итоге любой метод, который я выбираю, будет использоваться для очень больших наборов данных, и я хочу избежать потенциальной проблемы в будущем.
В настоящее время я планирую использовать один из методов для массива 5 на 8 по X. Я инициализировал каждый из методов ниже, чтобы быть 2 на 2 по X, чтобы было легче увидеть, где добавлены элементы.
трех методов заключаются в следующем:
Класс вложенности массив - массив элементов, хранящихся в классе, который является массивом внутри другого класса.
public static Tier3[] _Tier3 = new Tier3[2]
3D полный зубчатый массив - массив, расширяемый во всех трех измерениях.
public static Item[][][] _3DjaggedItems = new Item[2][][]
2D прямоугольная матрица - двумерная матрица в 2-х измерениях, хранящая зубчатые массивы.
public static Item[,][] _2Drectangle_3DjaggedItems = new Item[2,2][]
Если вы знаете, лучший способ хранения и доступа к этой структуре, пожалуйста, имейте в виде, что вы должны быть в состоянии напечатать «Привет, мир!» путем присвоения значений
public ItemSystem.Item _Item;
public ItemSystem.Item[] _ItemList;
и вызов PrintTest(); для печати сообщения.
Я сделаю все возможное, чтобы ответить на любые вопросы. Спасибо заранее за любую помощь!
Ниже приведен тестовый код, который я написал, используя все три метода для печати «Hello, world!». Просто скопируйте пасту в компилятор C# для запуска. Я использовал http://rextester.com/
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class ItemSystem
{
public struct Item
{
public string _1;
public string _2;
public string _3;
}
public class Tier2
{
public Item[] _Items;
}
public class Tier3
{
public Tier2[] _Tier2;
}
//The class of containers the data of which is initialized once.
public static Tier3[] _Tier3 = new Tier3[2]
{
new Tier3()
{
_Tier2 = new Tier2[2]
{
new Tier2()
{
_Items = new ItemSystem.Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
new Item() { _1 = "l", _2 = "o", _3 = "," },
new Item() { _1 = " ", _2 = "w", _3 = "o" },
new Item() { _1 = "r", _2 = "l", _3 = "d" },
new Item() { _1 = "!", _2 = "", _3 = "" }
}
},
new Tier2()
{
_Items = new ItemSystem.Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
}
},
}
},
new Tier3()
{
_Tier2 = new Tier2[2]
{
new Tier2()
{
_Items = new ItemSystem.Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
}
},
new Tier2()
{
_Items = new ItemSystem.Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
}
},
}
},
};
public static Item[][][] _3DjaggedItems = new Item[2][][]
{
new Item[2][]
{
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
new Item() { _1 = "l", _2 = "o", _3 = "," },
new Item() { _1 = " ", _2 = "w", _3 = "o" },
new Item() { _1 = "r", _2 = "l", _3 = "d" },
new Item() { _1 = "!", _2 = "", _3 = "" }
},
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
},
},
new Item[2][]
{
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
},
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" }
},
},
};
public static Item[,][] _2Drectangle_3DjaggedItems = new Item[2,2][]
{
{
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
new Item() { _1 = "l", _2 = "o", _3 = "," },
new Item() { _1 = " ", _2 = "w", _3 = "o" },
new Item() { _1 = "r", _2 = "l", _3 = "d" },
new Item() { _1 = "!", _2 = "", _3 = "" }
},
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
},
},
{
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
},
new Item[]
{
new Item() { _1 = "H", _2 = "e", _3 = "l" },
},
},
};
}
public class Program
{
public ItemSystem.Item _Item;
public ItemSystem.Item[] _ItemList;
public int _Tier3Accessor = 0;
public int _Tier2Accessor = 0;
public void TestFunc()
{
_Item = ItemSystem._Tier3[_Tier3Accessor]._Tier2[_Tier2Accessor]._Items[0];
_ItemList = ItemSystem._Tier3[_Tier3Accessor]._Tier2[_Tier2Accessor]._Items;
PrintTest();
_Item = ItemSystem._3DjaggedItems[_Tier3Accessor][_Tier2Accessor][0];
_ItemList = ItemSystem._3DjaggedItems[_Tier3Accessor][_Tier2Accessor];
PrintTest();
_Item = ItemSystem._2Drectangle_3DjaggedItems[_Tier3Accessor, _Tier2Accessor][0];
_ItemList = ItemSystem._2Drectangle_3DjaggedItems[_Tier3Accessor, _Tier2Accessor];
PrintTest();
}
public void PrintTest()
{
for(int i = 0; i < _ItemList.Length; i++)
{
Console.Write(_ItemList[i]._1);
Console.Write(_ItemList[i]._2);
Console.Write(_ItemList[i]._3);
}
Console.WriteLine("\n");
}
public static void Main(string[] args)
{
Program p = new Program();
p.TestFunc();
}
}
}
Можете ли вы переместить это на [codereview] (http://codereview.stackexchange.com/)? Потому что проблема с кодом не исправлена. –
Конечно, я могу разместить его там. Я отправил код, чтобы тот, кто пытается ответить на мои вопросы оптимизации, может точно видеть, что я делаю. –
Всё зависит от меня. Только вы знаете шаблоны доступа: какие размеры идут с каким шагом в каком порядке, доступ более или менее случайный, будут ли данные распределяться между потоками, требующими синхронизации, размерами кэшей на целевой машине, .... – HABO