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

11

我有一个示例类,其中包含两个数据点:

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解决方案。

3个回答

21

使用扩展方法,首先 OrderBy 枚举,然后按名称进行 ThenBy

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

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

4
这应该可以了,我想。
var result = from m in list
             orderby m.Sort, m.Name
             select m;

这个语法不正确。select m 需要放在最后,然后它就会正确了。 - Ahmad Mageed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接