我有一个包含两个数据点的示例类:
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解决方案我不知道。
答案 0 :(得分:21)
使用扩展方法,首先OrderBy
枚举,ThenBy
名称。
var sorted = list.OrderBy( m => m.Sort ).ThenBy( m => m.Name );
答案 1 :(得分: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;
}
上述方法将首先按枚举对象排序,如果枚举值相等,则比较名称。然后,只需致电list.Sort()
,它就会输出正确的订单。
答案 2 :(得分:4)
我应该这样做,我想
var result = from m in list
orderby m.Sort, m.Name
select m;