1
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();

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

(多索引用户数组)

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

使用 dharnitski 的解决方案。它需要0毫秒。:)

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

public  class   FastArray<T> 
4

1 回答 1

4

如果您的数据没有准备好,那么如果没有完整的数据集扫描,您将无法获得您想要的结果。在时间不紧迫时提前准备数据,并在您需要较短的响应时间时处理已排序的数据。

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

有一个包含 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();

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

于 2012-06-08T00:25:04.433 回答