多个字段索引对象数组

本文关键字:对象 数组 索引 字段 | 更新日期: 2023-09-27 18:36:42

public class User
{
   public int Id { get; set; }
   public int Age { get; set; }
   public string Name { get; set; }
}

我有 100k 用户。

查询:获取名称为"Rafael"且年龄在 40 到 50 之间的用户

  • 通过 Linq2Objects : users。Where(p=>p. Name=="Rafael" && p.Age>=40 && p.Age<=50).ToArray();

有没有更好的性能的替代影响?(只读线程安全)

(多索引用户阵列)

我已经测试了它的性能。对于 1000k 用户,需要 30-50 毫秒。这似乎并不重要,但确实如此。因为我可以在一秒钟内收到 50 个请求。

用达尼茨基的解决方案。需要 0 毫秒。 :)

但是是否有任何代码框架使其透明。

public  class   FastArray<T> 

多个字段索引对象数组

如果未准备好数据,则无法在没有完整数据集扫描的情况下获得所需的结果。当时间不重要时提前准备数据,并在需要较短响应时间时处理排序的数据。

在数据库世界中有一个类比。

有一个包含 100K 记录的表。有人想要运行带有"where"子句的 Select 查询,该子句按非主键过滤数据。除非实现索引,否则执行计划中始终是缓慢的"表扫描"操作。

使用 ILookup<TKey, TValue> 实现索引的代码示例:

//not sorted array of users - raw data
User[] originalUsers;
//Prepare data in advance (create one index). 
//Field with the best distribution should be used as key
ILookup<string, User> preparedUsers = originalUsers.ToLookup(u => u.Name, u => u);

//run this code when you need subset 
//search by key is optimized by .NET class 
//"where" clause works with small set of data
preparedUsers["Rafael"].Where(p=> p.Age>=40 && p.Age<=50).ToArray();

这段代码不如数据库索引强大(例如,它不支持子字符串),但它显示了这个想法。