在单个枚举上排序

时间:2014-05-26 15:28:11

标签: c#

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的所有对象放到列表顶部。其余的项目我想留下。在正确的道路上,任何人都可以帮助我解决这个问题的其余部分吗?

感谢。

3 个答案:

答案 0 :(得分:2)

“比较”不保证保留原始订单。因此,如果您想在当前位置保留除“第一”之外的其他项目,则必须实施自己的排序过程。

这是一种简单,非常幼稚的形式:

// 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);

结果应包含预期的列表。

答案 1 :(得分:0)

如果没有订购,您可以使用WhereConcat

来完成订购
IList<Test> ordered = tests
            .Where(x => x.Sort == Sort.First)
            .Concat(tests.Where(x => x.Sort != Sort.First)).ToList();

答案 2 :(得分:0)

试试这个比较器:

    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;
        }
    }