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

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

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 list = new List() { 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解决方案。

使用扩展方法,首先是OrderBy的枚举,然后是ThenBy名称。

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

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

  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() ,它将输出正确的顺序。

我认为应该这样做

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