C#中类对象的排序列表

Sort list of class objects in c#

本问题已经有最佳答案,请猛点这里访问。

我要对类对象列表进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
class tocka
{
Point t;
double kut;
int redkotiranja;

public tocka(Point _t, double _kut, int _redkotiranja)
{
t = _t;
kut = _kut;
redkotiranja = _redkotiranja;
}
}

以下是列表:

1
2
3
4
5
6
7
8
9
10
11
List<tocka> tocke= new List<tocka>();
tocka a = new tocka(new Point(0, 1), 10, 1);
tocke.Add(a);
tocka b = new tocka(new Point(5, 1), 10, 1);
tocke.Add(b);
tocka c = new tocka(new Point(2, 1), 10, 1);
tocke.Add(c);
tocka d = new tocka(new Point(1, 1), 10, 1);
tocke.Add(d);
tocka ee = new tocka(new Point(9, 1), 10, 1);
tocke.Add(ee);

我想按t.X对清单tocke进行排序。

我怎么在C中做到这一点?


使用LINQ:

1
tocke = tocke.OrderBy(x=> x.t.X).ToList();

使t公开。


不使用LINQ的直接解决方案(只进行列表排序,不创建其他列表)。

如果t公开:

1
  tocke.Sort((left, right) => left.t.X - right.t.X);

但最好的办法,imho,是让class tocka具有可比性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class tocka: IComparable<tocka> {
  ...

  public int Compare(tocka other) {
    if (Object.RefrenceEquals(other, this))
      return 0;
    else if (Object.RefrenceEquals(other, null))
      return 1;

    return t.X - other.t.X; // <- Matthew Watson's idea
  }
}

// So you can sort the list by Sort:

tocke.Sort();


您可以使用以下方法就地排序:

1
tocke.Sort((a, b) => a.t.X.CompareTo(b.t.X));

或者使用LINQ(创建新列表):

1
tocke = tocke.OrderBy(x=> x.t.X).ToList();

您可能应该将t封装为一个属性。另外,如果t可以是null的话,你应该在上面的lambda中加上无效检查。


  • 首先,您应该在类中添加public修饰符。
  • 其次,您应该将字段重构为属性。建议将属性公开给公众而不是字段。

那么解决办法是如下

1
2
3
4
public class Tocka
{
    public Point Point { get; private set; }
}

作为你问题的答案,你应该使用Linq

1
2
List<Tocka> l = ...
var orderedTocka = l.OrderBy(i => i.Point.X);

注:只需确保这一点永远不是null,否则上面列出的Linq-Query将不起作用。


例如,您可以使用Linq:

1
tocke.Sort( (x,y) => x.t.X.CompareTo(y.t.X) );

但首先,你必须让t公开,至少在得到它的时候:

1
public Point t { get; private set; }