c# - 可以使用具有正确实现的比较器的 SortedList<>/SortedDictionary<> 来保证插入顺序吗?

标签 c# dictionary hashtable sortedlist sorteddictionary

如果目标是创建一个保留插入顺序的通用只读字典,SortedList<,> 或 SortedDictionary<,> 是否可以与尝试维护插入的 IComparer<> 一起使用通过执行类似于以下的操作来排序?

class OrderedComparer<T> : IComparer<M>
{
    public int Compare(M x, M y)
    {
        return x.Equals(y) ? 0 : -1;//or 1
    }
}
SortedList<M> orderedList = new SortedList<M>(new OrderedComparer<T>());

(有趣的是,在 SortedDictionary 的情况下,上述方法需要返回 0 或 1,以防止元素以相反的插入顺序排序)。

最佳答案

比较器必须遵守规律

Compare(a, b) == -Compare(b, a) //assuming only possible values are -1, 0, 1

这是 symmetry property .您的示例代码不遵守它。因此,BCL 系列根本不给您任何保证。您违反了记录在案的契约(Contract)。

你不能这样做。

相反,您可以向 M 添加一个新字段,将插入顺序存储为 int。然后您可以在比较器中使用该字段。

关于c# - 可以使用具有正确实现的比较器的 SortedList<>/SortedDictionary<> 来保证插入顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480654/

相关文章:

java - HashMap 键的顺序究竟何时受到影响,

arrays - 哈希表和碰撞计算结果

c# - MVC5 中无法访问自定义 IPrincipal

c# - 如何在 C# 中暂停计时器?

c# - C# 中的 Selenium 如何根据其值定位此跨度?

c# - os的Visual Studio条件编译

python - Python 中的字典分组和聚合列表

python - 将包含另一个具有多个值的字典列表的字典列表转换为数据帧

python - 比较列表和字典

perl - 为什么 Perl CGI 模块使用连字符开始命名参数?