相关疑难解决方法(0)

SortedList <>,SortedDictionary <>和Dictionary <>

我发现SortedList<TKey, TValue> SortedDictionary<TKey, TValue>Dictionary<TKey, TValue>实现相同的接口.

  1. 什么时候应该选择SortedList还是SortedDictionary结束Dictionary
  2. 之间有什么区别SortedListSortedDictionary应用方面?

c# generics dictionary sortedlist sorteddictionary

85
推荐指数
5
解决办法
4万
查看次数

何时使用SortedList <TKey,TValue>而不是SortedDictionary <TKey,TValue>?

这似乎与这个问题重复,后者询问" SortedListSortedDictionary之间有什么区别?" 不幸的是,答案只是引用MSDN文档(它清楚地表明两者之间存在性能和内存使用差异),但实际上并没有回答这个问题.

事实上(根据MSDN,这个问题没有得到相同的答案):

SortedList<TKey, TValue>通用类是O(log n)的检索,其中n是字典中的元件的数目的二进制搜索树.在这里,它类似于 SortedDictionary<TKey, TValue>泛型类.这两个类具有相似的对象模型,并且都具有O(log n)检索.两个类别的不同之处在于内存使用和插入和移除速度:

  • SortedList<TKey, TValue>使用的内存少于SortedDictionary<TKey, TValue>.

  • SortedDictionary<TKey, TValue>对于未排序的数据,O(log n)具有更快的插入和删除操作,而不是O(n) SortedList<TKey, TValue>.

  • 如果列表是从排序数据中一次性填充的,SortedList<TKey, TValue>则速度快于 SortedDictionary<TKey, TValue>.

所以,显然这表明这SortedList<TKey, TValue>是更好的选择,除非您需要更快的插入和删除未排序数据的操作.

问题仍然存在,鉴于以上信息,使用a的实际(现实世界,商业案例等)原因是SortedDictionary<TKey, TValue>什么?根据绩效信息,这意味着根本没有必要SortedDictionary<TKey, TValue>.

.net c# sortedlist sorteddictionary

63
推荐指数
5
解决办法
4万
查看次数

SortedList与SortedDictionary vs. Sort()

这是像这样的问题的延续.

是否有任何调整性能的指导原则?我并不是指大O的收益,只是节省一些线性时间.

例如,要花多少钱预分类保存在任SortedListSortedDictionary

假设我有一个有3个属性的人类排序,其中一个是年龄.我应该先按年龄换取物品吗?

我应该首先对一个属性进行排序,然后使用结果列表/字典对两个属性进行排序,依此类推?

想到的任何其他优化?

.net sorting performance sortedlist sorteddictionary

22
推荐指数
1
解决办法
2万
查看次数

相当于允许重复键的排序字典

我需要一个数据结构,可以通过与它们关联的浮动键对对象进行排序,最先降低.问题是密钥代表成本所以经常有重复,我不关心这个,因为如果两个具有相同的成本,我只会抓住第一个,因为它没有区别,问题是编译器抱怨.

是否存在行为方式相同但允许重复键的数据结构?

编辑 - 我仍然需要重复项,因为如果一个结果是一个死胡同,我抓住下一个(他们是一个*搜索中的节点)

所以为了清楚起见,它需要允许按顺序排序的重复键.

c# dictionary data-structures

13
推荐指数
4
解决办法
2万
查看次数

维护排序顺序C#的集合

我有一个Foo包含对象列表的类:List<Bar>.每个Bar属性都有一个属性,可以对它们进行排序(类型TimeSpan,表示持续时间),并且Bar是一个不可变对象 - 也就是说,持续时间不会随着算法的运行而改变.目前,对于每一个Foo我也保持Bar在列表中的第一个如果它被订购(即Bar最短的持续时间).像这样的东西:

public class Foo
{
    public List<Bar> AllBars { get; set; }

    public Bar FirstBar { get; set; }

    public Foo (Bar bar)
    {
        FirstBar = bar;

        AllBars = new List<Bar>() { bar };
    }

    public AddBar(Bar bar)
    {
        if(bar.Duration < FirstBar.Duration)
        {
            FirstBar = bar;
        }

        AllBars.Add(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

此类Foo用于处理性能(速度)至关重要的算法中.记忆很重要但不如速度快.有一个n Foo s 列表,每个都有m Bar s.直到这一刻,这门课一直很好.我现在希望为用户提供多种选择,这意味着我需要提供Bar对列表中前几个s的随机访问. …

.net c# sorting performance icomparable

12
推荐指数
2
解决办法
2905
查看次数

获取SortedDictionary中的最后一个元素

我看到了这个问题.

如何在.Net 3.5中获取SortedDictionary中的最后一个元素.

c# collections sorteddictionary

10
推荐指数
2
解决办法
1万
查看次数

SortedDictionary上First()vs Last()的表现

我正在使用SortedDictionaries来模拟一个队列(由于我有一些要求),我在排序的字典上调用Last()来获取我需要出列的项目.

我只是想知道使用自定义比较器并调用First()或继续调用Last()的性能.

在反编译.NET 3.5程序集之后,我发现SortedDictionary类确​​实有一个Count属性,所以我猜测框架只返回调用First时位置0的项目,以及位置[count-1]时的项目最后一个叫,我是对的?

linq performance sorteddictionary .net-3.5

4
推荐指数
2
解决办法
854
查看次数

顺时针对列表中的2d点进行排序

基本上我有一个点列表,每个点都有X,Y,Z(Z总是相同的).

例如:

pointList.add(Point p = new Point(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)

但是我无法将它们按顺时针顺序排序.

我知道中心,我知道每个列表中大约有600个点.

我以前用Python完成了这个,但是我在C#中遇到了麻烦.

Python代码:

pointlist.sort(key=lambda c:atan2(c[0], c[1]))
Run Code Online (Sandbox Code Playgroud)

c# coordinates

4
推荐指数
1
解决办法
5030
查看次数

C#.NET中数据的最佳集合

我必须存储这些数据:

 "AL" => 1997
 "AK" => 1977
 ...
 "WY" => 1997
Run Code Online (Sandbox Code Playgroud)

在.NET中存储这个的最佳方法是什么?我应该只使用数组,arrayList或其他集合吗?

.net c# arrays collections

3
推荐指数
1
解决办法
2318
查看次数

在 C# 中管理时间序列

我想听听您对 C# 中管理时间序列的最佳方法的看法。我需要有一个类似于二维矩阵的 Datetime 对象作为行索引(有序且不重复),并且每列将代表相关 Datetime 的股票值。我想知道这些对象中的任何一个是否能够处理日期的缺失数据:添加列或时间序列会在行索引中添加缺失的日期,并会添加“null”或“N/a”现有日期缺失值。

与 C++ 相比,C# 中已经提供了很多东西,我不想错过一些明显的东西。

c# collections datetime time-series

2
推荐指数
1
解决办法
8048
查看次数

寻找可以访问上一个和下一个元素的 .Net 排序集合

我正在实施Bentley-Ottman 算法,该算法需要扫描线 (SL) 具有以下属性的数据结构:

  • 维护 的排序集合T,其中TIComparable<T>
  • 元素的插入应该是O(log count),并且应该返回元素是否已经插入,
  • 删除元素应该是O(log count)
  • 对于给定的元素e(无论是否已经在集合中),我需要e排序顺序旁边的集合的上一个和下一个元素。

SortedList<TKey, TValue>O(count)at 插入和删除,因为它必须移动列表中的所有连续元素。但是,O(1)一旦我知道e.

SortedDictionary<TKey, TValue>SortedSet<T>O(log count)插入和删除,但我找不到任何迭代器给我下一个和上一个元素。

是否有任何实现可以为我提供完整的功能?

如果没有,实现它的最快方法是什么?LinkedList<T>不允许二分查找。List<T>仍然有O(count)插入/删除。我真的必须实现我自己的平衡树吗?

.net c# sorting data-structures sortedcollection

2
推荐指数
1
解决办法
518
查看次数