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); |
我想按
我怎么在C中做到这一点?
使用LINQ:
1 | tocke = tocke.OrderBy(x=> x.t.X).ToList(); |
使
不使用LINQ的直接解决方案(只进行列表排序,不创建其他列表)。
如果
1 | tocke.Sort((left, right) => left.t.X - right.t.X); |
但最好的办法,imho,是让
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(); |
您可能应该将
- 首先,您应该在类中添加
public 修饰符。 - 其次,您应该将字段重构为属性。建议将属性公开给公众而不是字段。
那么解决办法是如下
1 2 3 4 | public class Tocka { public Point Point { get; private set; } } |
作为你问题的答案,你应该使用
1 2 | List<Tocka> l = ... var orderedTocka = l.OrderBy(i => i.Point.X); |
注:只需确保这一点永远不是
例如,您可以使用Linq:
1 | tocke.Sort( (x,y) => x.t.X.CompareTo(y.t.X) ); |
但首先,你必须让
1 | public Point t { get; private set; } |