按属性排序列表,然后按另一个排序
我有一个包含两个数据点的示例类:
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;