按属性排序列表,然后按另一个

Posted

技术标签:

【中文标题】按属性排序列表,然后按另一个【英文标题】:Sort a List by a property and then by another 【发布时间】:2011-01-25 17:32:21 【问题描述】:

我有一个包含两个数据点的示例类:

public enum Sort  First, Second, Third, Fourth 
public class MyClass

    public MyClass(Sort sort, string name)  
        this.Sort = sort; 
        this.Name = name; 
    

    public Sort Sort  get; set; 
    public string Name  get; set; 

我希望通过 Sort 属性将它们分组,然后按字母顺序排列这些组。

List<MyClass> list = new List<MyClass>()  
    new MyClass(MyClass.Sort.Third, "B"), 
    new MyClass(MyClass.Sort.First, "D"),
    new MyClass(MyClass.Sort.First, "A"),
    new MyClass(MyClass.Sort.Fourth, "C"),
    new MyClass(MyClass.Sort.First, "AB"),
    new MyClass(MyClass.Sort.Second, "Z"),
;

然后输出将是: (显示Name

A
AB
D
Z
B
C

我已经能够通过使用 foreach 将项目分成许多较小的数组(按枚举值分组)来做到这一点,但这似乎非常乏味 - 我认为我必须有一些 LINQ 解决方案不知道。

【问题讨论】:

【参考方案1】:

使用扩展方法,先OrderBy枚举,ThenBy名称。

var sorted = list.OrderBy( m => m.Sort ).ThenBy( m => m.Name );

【讨论】:

【参考方案2】:

除了不错的 LINQ 解决方案之外,您还可以使用您提到的比较方法来执行此操作。使MyClass 实现IComparable 接口,使用CompareTo 方法,如:

  public int CompareTo(object obj)
  
      MyClass other = (MyClass)obj;
      int sort = this.srt.CompareTo(other.srt);
      return (sort == 0) ? this.Name.CompareTo(other.Name) : sort;
  

上述方法将首先通过枚举对您的对象进行排序,如果枚举值相等,则比较名称。然后,只需调用list.Sort(),它就会输出正确的顺序。

【讨论】:

【参考方案3】:

我认为应该这样做

var result = from m in list
             orderby m.Sort, m.Name
             select m;

【讨论】:

此语法无效。 select m需要放在最后才对。

以上是关于按属性排序列表,然后按另一个的主要内容,如果未能解决你的问题,请参考以下文章

如何按另一个列表对列表进行排序

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

Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

按另一个具有重复项的列表对列表进行排序

如何在 Firebase 云 Firestore 中查询一个字段然后按另一个字段排序?

按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行