在c#中排序类对象列表

时间:2013-12-12 08:09:47

标签: c# list class sorting object

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

class tocka
{
Point t;
double kut;
int redkotiranja;

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

以下是清单:

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

我希望按tocke

对列表t.X进行排序

我是如何在C#中做到的?

5 个答案:

答案 0 :(得分:3)

使用LINQ:

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

公开t

答案 1 :(得分:1)

没有LINQ的直接解决方案(只是列表排序,没有额外的列表创建)。

提供t公开:

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

但恕我直言,最好的方法是让class tocka 可比较

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

答案 2 :(得分:0)

您可以使用LINQ,例如:

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

但首先你必须公开t,至少在获得它时:

public Point t { get; private set; }

答案 3 :(得分:0)

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

然后解决方案将如下:

public class Tocka
{
    public Point Point { get; private set; }
}

作为对您问题的回答,您应使用Linq

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

注意:请确保Point永远不会null,否则上面列出的Linq-Query将无效

答案 4 :(得分:0)

您可以使用以下方式进行就地排序:

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

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

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

您应该将t封装为属性。另外,如果t可以是null,则应该对上述lambda添加无效检查。