对单个Enum进行排序

本文关键字:排序 Enum 单个 | 更新日期: 2023-09-27 18:05:07

public class SortComparer : IComparer<Test>
{
    public int Compare(Test x, Test y)
    {
       if (x.Sort == y.Sort)
            return 0;
        if (x.Sort != Sort.First && y.Sort == Sort.First)
            return -1;
        return 1;
    }
}
public enum Sort
{
    First,
    Third,
    Second,
}
public class Test
{
    public Sort Sort { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        IList<Test> tests = new List<Test>();
        tests.Add(new Test { Sort = Sort.Second });
        tests.Add(new Test { Sort = Sort.Second });
        tests.Add(new Test { Sort = Sort.Third });
        tests.Add(new Test { Sort = Sort.Second });
        tests.Add(new Test { Sort = Sort.Third });
        tests.Add(new Test { Sort = Sort.First });
        tests.Add(new Test { Sort = Sort.First });
        IList<Test> ordered = tests.OrderBy(x => x, new SortComparer()).ToList();
    }
}

这是我到目前为止所尝试的。我试图让所有的对象与First的排序enum值到列表的顶部。其余的项目我想保持原样。有没有人能帮我解决剩下的问题?

谢谢。

对单个Enum进行排序

"Compare"不能保证保持原来的顺序。因此,如果你想在当前位置保留"First"以外的其他项,你必须实现自己的排序过程。

这是一个非常简单的sort形式:

// Initialization of "tests", class definition, etc.
List<Test> result = tests.Where(x => x.Sort == Sort.First ).ToList();       
var others = tests.Where(x => x.Sort != Sort.First);                
result.AddRange(others);

results应该包含预期的列表

无需排序,您可以使用WhereConcat:

IList<Test> ordered = tests
            .Where(x => x.Sort == Sort.First)
            .Concat(tests.Where(x => x.Sort != Sort.First)).ToList();

试试这个比较器:

    public class SortComparer : IComparer<Test>
    {
        public int Compare(Test x, Test y)
        {
            if (x.Sort == y.Sort) {
                return 0;
            }
            if (x.Sort == Sort.First){
                return -1;
            }
            if (x.Sort == Sort.Second && y.Sort==Sort.First){
                return 1;
            }
            if (x.Sort == Sort.Second && y.Sort==Sort.Third){
                return -1;
            }
            return 0;
        }
    }