c#中类对象的排序列表[重复]
Posted
技术标签:
【中文标题】c#中类对象的排序列表[重复]【英文标题】:Sort list of class objects in c# [duplicate] 【发布时间】:2013-12-12 08:09:47 【问题描述】:我想对类对象列表进行排序。
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);
我想按t.X
对列表tocke
进行排序
我如何在 C# 中做到这一点?
【问题讨论】:
【参考方案1】:使用 LINQ:
tocke = tocke.OrderBy(x=> x.t.X).ToList();
公开t
。
【讨论】:
【参考方案2】:没有 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();
【讨论】:
+1 用于提供不将列表复制到另一个集合的答案,对其进行排序,然后将其复制回另一个列表 - 从而避免 LINQitis 的坏情况。 ;) 顺便说一句,我认为您可以通过返回(other.t.X - t.X)
来简化比较,因为该值只需为 +ve、-ve 或 0。【参考方案3】:
您可以使用 LINQ,例如:
tocke.Sort( (x,y) => x.t.X.CompareTo(y.t.X) );
但首先你必须将t
公开,至少在获取时:
public Point t get; private set;
【讨论】:
【参考方案4】: 首先,您应该将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
将不起作用
【讨论】:
【参考方案5】:您可以使用以下方法就地排序:
tocke.Sort((a, b) => a.t.X.CompareTo(b.t.X));
或者使用 LINQ(创建一个新列表):
tocke = tocke.OrderBy(x=> x.t.X).ToList();
您可能应该将t
封装为一个属性。此外,如果t
可以是null
,则应在上述 lambdas 中添加空值检查。
【讨论】:
以上是关于c#中类对象的排序列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章