如果我的数据结构定义为:
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 }
}
这适合我,但它似乎也有点垃圾。我的要求是将对象存储在一组坐标上,然后能够以协调的方式迭代它们。任何人都可以帮助一个很好的解决方案,无论是在存储或检索方面(或理想情况下,两者)?
答案 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;
允许在给定坐标的情况下快速搜索数据。