【问题标题】:Need sorted dictionary designed to find values with keys less or greater than search value需要排序字典来查找键小于或大于搜索值的值
【发布时间】:2011-02-11 11:55:35
【问题描述】:

我需要对象按价格排序(十进制)值以便快速访问。我需要能够找到价格高于A低于B的所有对象。我在考虑 SortedList,但它没有提供从给定键值开始查找升序或降序枚举数的方法(比如给我价格低于 120 美元的所有对象)。

考虑一个系统,它接受来自卖家的待售汽车并将它们存储到该集合中。然后买家希望找到价格低于 1000 美元的汽车。

基本上我需要的是基于树的集合和功能来查找更小\更大\等于提供的键的节点。

请指教。

【问题讨论】:

  • 据我了解,您必须以某种方式将对象存储在内存中,并能够快速选择其中一些。你为什么要问这个? (可能你有一些细节?)这样的操作非常快(因为它全部在内存中,而不是 SQL 查询),你必须继续以某种方式实现它。您可以将逻辑封装在某个类中并提供接口。当困难来临时(如果他们真的来了),你必须分析和优化你的课程(界面应该是不变的)。对于您的班级的第一次实施,Marcelo Cantos 的解决方案已经足够好了。不要害怕 LINQ:)

标签: c# .net data-structures dictionary sortedlist


【解决方案1】:

请考虑一个 SortedList。或者,您可以使用任何集合并使用 LINQ 查询它。例如普通的通用列表:

        List<Int32> tempList = new List<Int32>();

        tempList.Where(singleItem => singleItem > 100)
            .ToList<Int32>();

【讨论】:

    【解决方案2】:

    您可以在SortedList 上使用BinarySearch 搜索满足您条件的第一个和最后一个索引,然后从列表中获取项目范围。

    【讨论】:

      【解决方案3】:

      答案取决于您的使用模式。如果这是一次性使用未排序的输入集并找到合适对象的练习,那么最好只使用 LINQ:

      list.Where(e => A < e.Price || e.Price < B);
      

      如果列表是静态的,并且您想查询多个范围,则将对象粘贴到一个数组中,按价格对它们进行排序,然后使用二进制印章查找感兴趣的范围。

      【讨论】:

      • 我不需要封闭范围,只需更少或更大
      • 这是一个相当简单的改变。
      • 确实如此。由于性能问题,我不愿意使用 LINQ。
      • 不要过早优化。 LINQ 代码对于大多数用途来说足够快,在某些情况下甚至可以胜过手写的列表操作逻辑。
      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多