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#中类对象的排序列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中对列表进行排序[重复]

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]

C#:自定义属性上的排序列表[重复]

C#中对列表进行排序的方法[重复]

在 C# 中对对象列表进行排序

C#使用列表属性展平对象列表[重复]