2

我在 Visual Studio (c#) 中看到过类似 SortedList 的东西。但是,我不知道它是如何工作的以及如何使用它。我想使用 SortedList 因为我希望它的访问时间比普通列表快。不幸的是,我不能使用数组。我很高兴看到一些简单的例子。

编辑:假设有一个对象类:

class Point
{
public Point(int a, int b) {x = a; y = b;}
int x;
int y;
}

// x value will not be repeating in a list
Point a1 = new Point(1,2);
Point a2 = new Point(3,5);
Point a3 = new Point(0,2);
Point a4 = new Point(2,7);
Point a5 = new Point(14,2);
Point a6 = new Point(9,10);

SortedList<Point> list = new SortedList<Point>();

list.Add(a1);
list.Add(a2);
list.Add(a3);
list.Add(a4);
list.Add(a5);
list.Add(a6);

是否可以在 O(log2n) 时间内添加所有这些元素?我希望我的列表在添加后看起来像这样。无需在排序后被迫再次对其进行排序。

(0,2)
(1,2)
(2,7)
(3,5)
(9,10)
(14,2)

然后我想检查一下,是否有 (x == 9) 的对象。在 O(log2n) 时间内有可能吗?

谢谢

4

3 回答 3

7

你可以这样做,

var list = new SortedList<int, Point>
{
    { 1, new Point(1, 2) },
    { 3, new Point(3, 5) },
    { 0, new Point(0, 2) },
    { 2, new Point(2, 7) },
    { 14, new Point(14, 2) },
    { 10, new Point(9, 10) },
}

如 MSDN 所述,内联对象初始化对 SortedLists 尤其有益。

要查看 x 是否为 3,您可以使用

Point x3Point;
if (list.TryGetValue(3, out x3Point))
{
    //x3Point is now set to the Point with an x value of 3.
}

当然你可以只存储两个ints

var list = new SortedList<int, int>
{
    { 1, 2 },
    { 3, 5 },
    { 0, 2 },
    { 2, 7 },
    { 14, 2 },
    { 10, 10 },
}

你可以这样使用

int yValue;
if (list.TryGetValue(3, out yValue))
{
    var x3Point = new Point(3, yValue);
}

理想情况下,您使用预先排序的数据初始化列表。

于 2013-01-14T17:31:54.380 回答
1

直接来自 MSDN:

表示键/值对的集合,这些键/值对按键排序,可通过键和索引访问。

因此,当然,如果您必须保持其值始终按特定标准排序,那么它是一种非常有用的 List 类型。查看此链接以获取更多示例和说明!

于 2013-01-14T17:12:10.303 回答
1

您可以通过 LINQ 映射查询创建SortedList 。下面给出示例。请注意,SortedList 基本上是一个带有键值项的排序哈希表( SortedListimplements )。IDictionary所以我从整数数组中选择相等的键和值。

var ints = new []{1,54,65,76,34,36};
SortedList sorted =  new SortedList(ints.ToDictionary(key => key, val => val));
于 2013-01-14T17:13:47.313 回答