list中的实现快速查询
实体类字段 : ID name Longitude Latitude receiveTime
list中差不多得有2W多条记录, silverlight程序500ms就要在list中查询符合条件的记录.
查询条件是: [三个参数]
double _lon1=36;
double _lat1=120;
double _lon2=37;
double _lat2=121;
datetime _time=2010-09-12 09:09:45;
条件: longtude>=_lon1 && longtude<=_lon2 && Latitude>=_lat1 && Latitude<=lat2 && receiveTime<_time
我现在的作法是 foreach 遍历整个list, 然后一条一条的比较, 符合条件的再添加至另外的list使用.
请问有没有其它更加高效的算法.数据也可以不保存在list中,
[解决办法]
_lon1 、_lon2、_lat1、lat2、_time 这5个都是标量吧?
用 LINQ 的扩展方法 Where() 试试,看看效果有没有提高。
不要楼主为什么要设计成在 Silverlight 端保存2W多条记录呢,这不是个好办法。
[解决办法]
List<MyClass> list = new List<MyClass>();
List<MyClass> listFind = list.FindAll(target =>
{
double _lon1 = 36;
if (target.Longitude >= _lon1)
{
return true;
}
else
{
return false;
}
});
[解决办法]
我不知道 LINQ 的 Where() 扩展方法会不会采用一些数据结构的算法,只能是先让楼主试试咯,
但是在没有主键等索引的情况下,在内存中查询2W多条记录,开销也是很大的。
如果要增加、从中间插入、删除,开销则更大。
如果是使用 DataTable ,把这几个属性都设为主键,性能是能提高很大的,但是可惜 Silverlight 不支持 DataTable 。
觉得根本的解决方法应是从改变数据库设计入手,设计出一种体现出“增量”变化的数据表,每次只查询“增量”变化的数据表速度可以从根本上得到提高。
[解决办法]
感觉楼主在设计Silverlight数据库。。
学习了。
[解决办法]
有时间可以跟楼主讨论一下数据库的设计。
不过有些疑惑,既然是采用Silverlight应用程序这种分布式的客户端,为什么又要设计为实时的显示/处理大批量的数据呢? 本身“实时”就不是分布式的客户端所能胜任的,而“大批量显示”更是Silverlight所不能实现的。
不知楼主的具体应用场景是?
[解决办法]