我正在编写一个有序对象集合的接口。像往常一样,我将其留给用户指定这些项目的排序方式。然而,我目前正在提供一个键值接口(其中sort键明确地与值分开)或仅值接口(其中值也是排序键,或者用户必须处理单独的排序)之间通过传递一些比较函数键。)
在我看来,键值界面会强制用户始终拥有一个与值分开的键,即使某些值自然形成自己的键。它确实消除了从用户处理密钥的责任,但是在使用我的API时可能会导致更简单和更清晰的用户代码。仅值接口允许更紧凑地表示作为其自己的键的值,但是在存在自然键值区别的情况下,强制用户跟踪和处理它们自己的键。
当然,有文献支持这两种方法,虽然在我看来(可能是错误的)老文献倾向于选择仅限价值的方法,而较新的文献倾向于采用关键价值方法。
我很好奇你喜欢这些情况。我们到达的时间点通常比另一个更受欢迎吗?如果没有,你通常使用什么,为什么?
答案 0 :(得分:1)
你似乎被称之为(在各种语言中,各种区别,但基本上......)
这两种类型的容器用于不同的目的,尽管有一些调整,但是List无法做到这一点。这只是因为词典有更多信息。
一般来说, 比隐式更明确
如果我递给你"2 dollars blue crayon"
(列表),你会推断它是一个具有以下属性的对象:{Price = 2$, Color = blue, Type = Crayon}
(字典)。然而,这种解析(在需要时)需要域的努力和知识或数据的隐式结构;字典方法允许您以通用方式处理信息。
有些情况下列表“更好”,但这通常与技术/操作考虑相关,而不是列表方法的固有属性。例如,为了使用简单的全文引擎实现搜索索引,可能需要将所有属性混合在一起(这反映了最终用户键入未标记关键字的方式,期望它们可以在任何属性中找到)。
实用推荐,回答问题是提供:
除非先验明显关注性能(例如:容器将收到数万个项目,将有数千个容器实例,容器将通过慢速通道等),I 首先关注API ,轻松实现,例如将其基于Dictionary。在以后的日子里,如果有必要,可以修改实现,例如使用两个列表和一个地图模式。
最后一件事:有很多库(甚至语言内置函数)提供这种多态容器:也许看看你的目标系统/语言是否可用... < / p>
答案 1 :(得分:0)
嗯,这似乎符合您的要求。如果没有指定keyseelctor,则集合假定在项目本身上定义了排序 - 它们应该实现IComparable。 否则 - 如果你有理论上可以用多种方式比较的项目 - 你可以指定一个键选择器,它将返回一个IComaprable本身的项目投影。
例如,如果您有一个具有姓名和年龄的Person,并且您希望按年龄保留一个排序列表,则可以按以下方式创建该集合:
new OrderedCollection(person =&gt; person.Age);
BTW查看.Net附带的SortedDictionary和SortedList集合。它们可能会派上用场。
答案 2 :(得分:0)
如果为字符串+值创建包装器结构或对象,并且只是将值部分留空,那么列表可以执行任何操作。字典唯一不能做的就是添加特定类型的值,然后使用返回该类型的枚举器直接响应GetEnumerator请求。但是,在字典周围构造一个包装类来做这件事很容易。
然而,字典和列表之间的主要区别在于它们处理Key部分相同但Value部分不相同的记录的方式。虽然我不喜欢Dictionary处理事物的方式(默认的索引属性使用'replace'语义,而add方法使用fail-if-exists语义;我的偏好是使用模式参数“add” “),它允许更改与特定键相关联的值。 “list”只能通过删除旧值并添加一个新值来尝试这样做,这可能会导致语义问题。