我正在开发一个项目,其中Arrays是所有内容的默认数据结构,每个查询都是以下列形式的线性搜索:
customer.Find(x => x.Name == name)
customer.Find(x => x.Id == id)
customer.Find(x => x is PreferredCustomer && x.Age >= age)
customer.Find(x => x.Name == name && x.Age == age)
在几乎所有情况下,查找条件都是明确定义的。例如,我们仅按一个或多个属性Id,Type,Name或Age搜索客户。我们很少搜索任何其他内容。
一个好的数据结构是否支持这些类型的任意查询,查找优于O(n)? .NET的任何开箱即用的实现?
答案 0 :(得分:4)
对于内存,你有几个选择。
大多数选项都是O(n)。话虽这么说,字典查找可以接近O(1)。
一种选择是将您的客户存储在多个词典中,每个词典都设置了名称,ID和年龄的键。如果在字典中使用相同的对象引用,则可以进行任何单个查找O(1),而不会产生大量开销。
当然,随着你的标准计数上升,这变得不太实际,但是对于3,它并不太糟糕。
如果您想要更多灵活性,那么数据库是一个合适的选择。许多数据库都可以选择使用完全内存数据库,包括SQLite,它允许任意查询比O(n)速度好得多。
答案 1 :(得分:0)
为什么不能将数据放入多个词典中?一个字典将名称映射到数据,另一个字典映射年龄等。
答案 2 :(得分:-1)
我假设所有数组都是IEnumerable
?
如何将LINQ用于对象?
http://www.beansoftware.com/ASP.NET-Tutorials/Linq-Objects-Collections-Arrays.aspx
然后,您可以编写类似LINQ语法的查询来获取数组的结果。