存储和访问2D数据

时间:2015-05-21 15:43:13

标签: c#

如果我的数据结构定义为:

public function getPersonalizableItemsByOwner(User $owner)
{
    $qb = $this
        ->getEntityManager()
        ->createQuery('SELECT pi FROM '.$this->getEntityName().' pi WHERE pi.ownerId = :owner_id AND (pi.deletedAt IS NULL OR pi.deletedAt > :referenceDate)')
        ->setParameters(array('owner_id' => $owner->getId(), 'referenceDate' => date('Y-m-d H:i:s')));

    return $qb->getResult();
}

我填充它:

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

我希望以协调的方式迭代它,如通过(x,y)坐标值并在那时检索值,我能想出的最好的是:

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 }
                    }

这适合我,但它似乎也有点垃圾。我的要求是将对象存储在一组坐标上,然后能够以协调的方式迭代它们。任何人都可以帮助一个很好的解决方案,无论是在存储或检索方面(或理想情况下,两者)?

1 个答案:

答案 0 :(得分:1)

创建一个具有两个坐标的专用类以及此的数据:

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;

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

相关问题