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
的所有对象放到列表顶部。其余的项目我想留下。在正确的道路上,任何人都可以帮助我解决这个问题的其余部分吗?
感谢。
答案 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)
如果没有订购,您可以使用Where
和Concat
:
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;
}
}