什么是用于查找唯一项目的良好.NET数据结构?

时间:2010-01-15 16:07:13

标签: c# data-structures unique

我有一大堆自定义对象,我已从系统中的查询中检索到这些对象。假设这些对象都有5个不同的属性 - FirstName,LastName,Gender,ZipCode和Birthday。对于每个不同的属性,我希望能够获得所有唯一值及其计数的列表,并按降序对它们进行排序。它是一种分面导航系统。因此,如果我在初始查询中有5000个结果,那么我希望能够显示从最受欢迎到最不受欢迎的前10个FirstNames与其旁边的计数。然后与其他属性相同。

目前我有一个例程,一次一个地检查每个项目并检查不同的属性并保留一堆不同的哈希表和信息。它工作但它超级慢。我认为一次一个地检查每个项目效率不高。是否有其他类型的C#结构我可以使用,这将使这种类型的信息更容易?我知道SQL Server在这类事情上做得很好 - 但我认为这不是一种可能性。我从不同系统的API获取自定义对象列表。所以我必须接受那些对象列表,并以某种方式将它们放入临时表中,这样做会破坏我的想法。另外,我认为SQL Server临时表是特定于连接的,我的应用程序会重新使用连接。

编辑:我要避免的是必须遍历列表并处理每个单独的项目。我想知道是否有一些数据结构允许我一次查询整个列表(如数据库)并获取信息。问题是我们的前端Web服务器刚刚受到重创,因为我们在服务器上有很多流量,人们正在点击这些分面的导航页面,我正在寻找一种更有效的方法。

有什么想法吗?

谢谢, 科里

3 个答案:

答案 0 :(得分:1)

i4o - 索引LINQ http://www.codeplex.com/i4o允许在对象上放置索引。

它基本上为clr。

提供了RDBMS风格的索引

您是否在初始查询中使用DBMS?在这种情况下,答案是: 为什么不设计特定的SQL查询?

答案 1 :(得分:1)

不幸的是,我很确定你问题的答案是“不”。如果您获取数据的方式是未编入索引的列表< MyObject>,那么某些内容将必须逐个浏览这些项目并进行分析它们用于Top-N或创建索引。即使你将它传递给另一个工具(临时数据库或第三方数据结构),你只需将处理放在其他地方,你的CPU就会发出同样的响应。您在原始问题中概述的解决方案似乎是最合理的事情。

一些建议:

  • 这些前N个列表对所有用户都是相同的,还是可以分成不同数量的用例?您可以获取它们一次并将它们存储在Web缓存中。也许设置一个后台进程,每隔M分钟更新一次,以使它们保持最新状态。
  • 这只是一个UI感知问题吗?您能先计算并显示最重要的结果,然后在后台计算其他结果并异步传送到页面吗?
  • 请求API提供商以更健壮的方式获得结果? :)
  • 投入更多硬件? :)

很抱歉没有回答,但我认为这里没有灵丹妙药。

答案 2 :(得分:0)

每个属性保留一个字典应该可以正常工作。它有多慢?你能告诉我们你正在使用的代码吗?应该在眨眼间处理5000件物品。

您使用的是.NET 3.5吗?如果是这样,LINQ可以帮助你解决很多问题 - 特别是,使用ToLookup反过来每个属性都会很好。