C#访问结构的3D数组的最佳方式

时间:2017-01-15 18:14:45

标签: c# optimization multidimensional-array indexing data-structures

Hello其他程序员。所以我有一个结构,并提出了3个不同的3D阵列来存储它。事实上,优化不是我的专长,我需要知道他们的东西的人的建议,关于存储和访问多维结构阵列的最佳方法。我需要知道,当相互比较时,这些方法中的任何一种在内存使用,访问速度等方面是否更好。除了我不知道的数组之外,还有更好的存储和访问结构的方法吗?我主要使用https://msdn.microsoft.com/en-us/library/2s05feca.aspx和其他堆栈溢出帖子作为参考。

我知道在小数据集方面,性能和内存使用可能微不足道,但我在这里发布的原因是因为我知道最终我选择的任何方法都将用于非常大的数据集,并且我希望避免潜在的问题。

目前,我计划将其中一种方法用于5 x 8 x X数组。我将下面的每个方法初始化为2乘2乘以X,以便更容易看到项目的添加位置。

这三种方法如下:

类数组嵌套 - 存储在类中的项数组,该类是另一个类中的数组。

public static Tier3[] _Tier3 = new Tier3[2]

3D完全锯齿状数组 - 一个可在所有三个维度上展开的数组。

public static Item[][][] _3DjaggedItems = new Item[2][][]

2D矩形阵列 - 存储锯齿状阵列的2维2D阵列。

public static Item[,][] _2Drectangle_3DjaggedItems = new Item[2,2][]

如果您知道更好的存储和访问此结构的方法,请记住,您必须能够打印出“Hello,world!”通过赋值给

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();
    }
}
}

1 个答案:

答案 0 :(得分:0)

想出来。做了一些搜索,过了一会儿就发现了这些帖子

What are the differences between a multidimensional array and an array of arrays in C#?

Why are multi-dimensional arrays in .NET slower than normal arrays?

简短的回答是,展平数组然后计算您想要访问的索引是最快的方法。接下来是Jagged数组,因为多维数组在C#中实现缓慢。

在格式化方面,Jagged数组还允许您根据需要初始化的方式保持更有条理。您可以使用扁平数组执行相同的操作,但是您需要通过间距和注释来获得创意,以确保所有内容都在视觉上以便于阅读。