对单个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值到列表的顶部。其余的项目我想保持原样。有没有人能帮我解决剩下的问题?
谢谢。
"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应该包含预期的列表
无需排序,您可以使用Where
和Concat
:
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;
}
}