存储和访问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...
}
}
这对我来说很有效,但它似乎也有点垃圾。我的要求是根据一组坐标存储对象,然后能够以协调的方式遍历它们。谁能提供一个好的解决方案,无论是在存储方面还是在检索方面(或者,理想情况下,两者都有)?
创建一个具有两个坐标和此点的数据的专门化类:
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;
允许在给定坐标的情况下快速搜索数据。