按属性排序列表,然后按另一个
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按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序