c# - 多字段索引对象数组

标签 c# linq-to-objects in-memory-database

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

我有 10 万用户。

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

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

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

(多索引用户数组)

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

使用 dharnitski 的解决方案。耗时 0 毫秒。 :)

但是有没有什么代码框架可以做到透明。

public  class   FastArray<T> 

最佳答案

如果您的数据没有准备好,您将无法在没有完整数据集扫描的情况下获得您想要的结果。 当时间不重要时提前准备数据,当您需要较短的响应时间时使用排序的数据。

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

有一个包含 10 万条记录的表。有人想运行带有“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();

这段代码没有数据库索引那么强大(例如它不支持子字符串)但是它展示了这个想法。

关于c# - 多字段索引对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941299/

相关文章:

c# - 如何读取超过 65535 行的 Excel 2007 电子表格?

c# - LINQ OrderBy 和 Where 组合

java - 如何使用 Derby 创建内存数据库表?

c# - 根据另一个列表中的两个参数从一个列表中删除项目

C# LINQ to 对象 : Group By/Sum help

java - 实现cacheStore时没有ID时如何加载数据来点燃缓存?

in-memory-database - 实时或内存数据库

c# - 如何以编程方式将审阅者分配给 Azure DevOps 拉取请求?

c# - 我可以用 Oxyplot 绘制积分面积吗?

c# - c#中的变体数组