如何制作和使用排序的对象列表(包含2个整数,列表应按其中一个排序)

时间:2013-01-14 17:04:59

标签: c# list sorting

我在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)时间吗?

由于

3 个答案:

答案 0 :(得分: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.
}

当然你可以存储两个int s

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);
}

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

答案 1 :(得分:1)

直接来自MSDN:

  

表示按键排序的键/值对的集合   并且可以通过密钥和索引访问。

因此,当然,如果必须保持其值始终按特定条件排序,则它是一种有用的List类型。请查看this link以获取更多示例和解释!

答案 2 :(得分:1)

您可以通过LINQ映射查询创建SortedList。实例如下。请注意,SortedList基本上是带有键值项的已排序哈希表(SortedList实现IDictionary)。所以我从int数组中选择相等的键和值。

var ints = new []{1,54,65,76,34,36};
SortedList sorted =  new SortedList(ints.ToDictionary(key => key, val => val));