c# - 为什么 .NET 中的排序集合没有匹配的接口(interface)?

标签 c# .net collections sorting base-class-library

<分区>

.NET 有一堆 sorted collections .但是,仅添加了实现,例如:

但是,这些都没有实现“匹配”接口(interface),它们只实现了 IList<T> , IDictionary<Tkey, TValue>ISet<T> .

在我看来,集合已排序这一事实是您可能希望在不进一步指定具体实现的情况下传达给消费者的。此外,我认为添加此类接口(interface)并不复杂。

我是不是想错了?

最佳答案

我会说这是“因为没有办法召集 SortedXXX<> 是如何排序的”。 IComparer<>接口(interface)不是自描述的。

如果我告诉您“此集合已排序”,此信息对您来说重要吗?也许它是按其键的 SHA256 排序的……它仍然是排序的,但是是按任何人都不会认为是“排序”的东西排序的?此“排序”给出的唯一保证是两次运行 GetEnumerable()将以相同的顺序返回项目(因此 GetEnumerable() 将是“稳定的”)。 HashSet<>甚至可能无法保证。

举个例子:

var ss1 = new SortedSet<string>(StringComparer.CurrentCultureIgnoreCase);

一个“经典”SortedSet<> , 按 CurrentCultureIgnoreCase 排序.它被“分类”为人类可以识别的东西。

var ss2 = new SortedSet<string>(Comparer<string>.Create((p, q) => p.GetHashCode().CompareTo(q.GetHashCode())));

A SortedSet<>GetHashCode() 订购它的元素。没有人会“欣赏”它……但它仍然是有序的:-)

如果您随后提出“那么接口(interface)可以简单地实现一个 Comparator getter 以返回使用了哪个比较器”(忽略比较器不是自描述的),请注意:

var cmp1 = StringComparer.CurrentCultureIgnoreCase; // instance of System.CultureAwareComparer
var cmp2 = StringComparer.CurrentCultureIgnoreCase; // instance of System.CultureAwareComparer

bool same = object.ReferenceEquals(cmp1, cmp2); // false

然后

var cmp3 = StringComparer.CurrentCulture; // instance of System.CultureAwareComparer

糟糕...甚至很难区分 StringComparer.CurrentCulture/StringComparer.CurrentCultureIgnoreCase .

最后我的观点是:

如果您知道集合已排序,那么在不知道其排序是否符合您需要的情况下,您可以如何处理该信息?

关于c# - 为什么 .NET 中的排序集合没有匹配的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36081431/

相关文章:

java - Collections.emptyList() 而不是空检查?

javascript - 如何查找一个对象值是否包含在另一个对象值中

c# - 适用于 OOP 的 C++ 和 C#

c# - 如何在修改其副本时保持通用列表不变?

c# - 使用依赖注入(inject)将 token 获取从startup.cs传递到HomeController.cs

c# - DataGridView 在显示之前不会自动调整列大小

c# - Linq to SQL 和集合操作

c# - 为什么此动态列表比较失败?

c# - .NetCore 和 SoapCore 如何进行身份验证

c# - 使用 StreamWriter 可以写入的字符数是否有最大限制?