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

cae*_*say 11 c# linq arrays sorting

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

我希望按照他们的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"),
};
Run Code Online (Sandbox Code Playgroud)

输出将是:(显示Name)

A
AB
D
Z
B
C
Run Code Online (Sandbox Code Playgroud)

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

tva*_*son 21

使用扩展方法,首先OrderBy是枚举,ThenBy名称.

var sorted = list.OrderBy( m => m.Sort ).ThenBy( m => m.Name );
Run Code Online (Sandbox Code Playgroud)


wsa*_*lle 5

除了漂亮的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;
  }
Run Code Online (Sandbox Code Playgroud)

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