【问题标题】:What is a good .NET data structure for finding unique items?什么是用于查找唯一项的良好 .NET 数据结构?
【发布时间】:2011-01-05 14:08:09
【问题描述】:

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

目前我有一个例程,一次检查每个项目并检查不同的属性并保存一堆不同的哈希表和信息。它有效,但速度非常慢。我认为一次通过每个项目不是很有效。是否有其他类型的 C# 结构可以让我更轻松地获取此类信息?我知道 SQL Server 在这类事情上做得很好——但我不认为这真的是一种可能性。我正在从不同系统的 API 获取我的自定义对象列表。因此,我将不得不获取该对象列表并以某种方式将它们放入临时表中,这与我认为的目的背道而驰。另外,我认为 SQL Server 临时表是特定于连接的,我的应用程序会重用连接。

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

有什么想法吗?

谢谢, 科里

【问题讨论】:

  • 为什么不在你的系统in查询中执行计数和排序?
  • 这是一个外部系统。我无法在那里进行计数和排序。我只能通过外部系统的 API 访问数据。所以我只能做以下事情 - List _results = SystemAPI.GetResults();然后,一旦我有了那个 MyObjects 列表,我就需要弄清楚我有多少不同的属性。
  • “我认为一次检查每个项目效率不高。” - 如果有人想出更好的方法,他们确实会变得非常富有。

标签: c# data-structures unique


【解决方案1】:

很遗憾,我很确定您的问题的答案是“不”。如果您获取数据的唯一方式是未编入索引的 List,那么 something 将不得不逐一检查这些项目并进行分析它们用于 Top-N 或创建索引。即使您将其传递给另一个工具(临时数据库或第三方数据结构),您也只是将处理放在其他地方,并且您的 CPU 将同样运行。您在原始问题中概述的解决方案似乎是最合理的做法。

一些建议:

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

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

【讨论】:

  • 谢谢戴夫。这就是我的假设。我可能只需要稍微重构一下我的代码并寻找加速或优化它的方法。我正在构建的系统是一个分面导航,允许人们选择分面(例如性别或邮政编码等),然后查看与所选分面匹配的新对象列表。然后当然 Top-N 列表是不同的,因为它们现在仅适用于当前选定方面的结果。希望这是有道理的。
  • 我可以使用某种缓存,这样如果我看到用户 A 要求与用户 B 5 分钟前选择的完全相同的方面,只需从缓存中给他们结果。但是如果原系统中的数据发生变化,我需要能够触发缓存刷新。
【解决方案2】:

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

它基本上为 clr 提供了 RDBMS 样式的索引。

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

【讨论】:

  • 不,初始查询不是来自 DBMS。它是通过第三方 API,所以我的查询是有限的。
【解决方案3】:

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

您使用的是 .NET 3.5 吗?如果是这样,LINQ 可以在很多方面为您提供帮助 - 特别是,依次使用 ToLookup 和每个属性会很好地工作。

【讨论】:

  • 不,我没有使用 .NET 3.5。我试图避免的是必须遍历列表并处理每个单独的项目。我想知道是否有一些数据结构可以让我一次查询整个列表(如数据库)并获取信息。问题是我们的前端网络服务器刚刚受到重创,因为我们在服务器上有大量流量,人们正在访问这些分面导航页面,我正在寻找一种更有效的方法。
  • @Corey:您如何期望any 数据结构能够神奇地处理元素而无需至少一次 遍历列表?一次应该是你所需要的,但你必须做一次......
  • 嗯,是的——我意识到有些东西必须遍历列表。我只是发现有一种比我现在做的更好、更有效的方法。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2013-06-02
  • 2018-06-18
  • 2012-10-30
相关资源
最近更新 更多