存储和访问2D数据

本文关键字:数据 2D 访问 存储 | 更新日期: 2023-09-27 17:50:20

如果我有一个数据结构定义为:

Dictionary<KeyValuePair<int, int>, object> rangedValue;

,我这样填充它:

rangedValue = new Dictionary<KeyValuePair<int, int>, object>()
                    {
                        { new KeyValuePair<int, int>(0,0), 424681 },
                        { new KeyValuePair<int, int>(1,0), 1072301 },
                        { new KeyValuePair<int, int>(2,0), 99111 },
                        { new KeyValuePair<int, int>(3,0), 467874 },
                        { new KeyValuePair<int, int>(0,1), 195066 },
                        { new KeyValuePair<int, int>(1,1), 1171412 },
                        { new KeyValuePair<int, int>(2,1), 0 },
                        { new KeyValuePair<int, int>(3,1), 128504 }
                    }

我想以一种协调的方式迭代它,比如通过(x, y)坐标值并检索该点的值,我能想到的最好的方法是:

foreach (var relativeXOffset in rangedValue.Keys.Select(kv => kv.Key).Distinct()) // Note distinct here, otherwise returns duplicates
{
    foreach (var relativeYOffset in rangedValue.Keys.Select(kv => kv.Value).Distinct())
    {
        var myObject = rangedValue[new KeyValuePair<int, int>(relativeXOffset, relativeYOffset)];
        // Do something with myObject...
    }
}

这对我来说很有效,但它似乎也有点垃圾。我的要求是根据一组坐标存储对象,然后能够以协调的方式遍历它们。谁能提供一个好的解决方案,无论是在存储方面还是在检索方面(或者,理想情况下,两者都有)?

存储和访问2D数据

创建一个具有两个坐标和此点的数据的专门化类:

public class XYD
{
    int x;
    int y;
    object data;
}

将这些类存储在List中:

List<XDY> xydList = new List<XYD();
xydList.Add(new XYD { x=0, y=0, data=424681 });
...

这创建了一个良好的存储,并允许迭代您的数据。但是搜索和检索时间是O(n)。

如果您需要更快的访问,您应该创建一个额外的字典:

Dictionary<Tuple<int,int>,XYZ> lookup;

允许在给定坐标的情况下快速搜索数据。