我想在C#中对列表进行排序。
就像结构属性AVC转到true的位置然后首先显示它们然后AVC变为false。有没有办法在C#LINQ中执行此操作?
答案 0 :(得分:108)
嗯,使用LINQ最简单的方法就是这样:
list = list.OrderBy(x => x.AVC ? 0 : 1)
.ToList();
或
list = list.OrderByDescending(x => x.AVC)
.ToList();
我相信 bool
值的自然顺序为false < true
,但第一种形式使IMO更清晰,因为每个人都知道0 < 1
。< / p>
请注意,这不会对原始列表本身进行排序 - 它将创建一个新列表,并将引用分配回list
变量。如果要进行排序,则应使用List<T>.Sort
方法。
答案 1 :(得分:17)
喜欢这个吗?
在LINQ中:
var sortedList = originalList.OrderBy(foo => !foo.AVC)
.ToList();
或就地:
originalList.Sort((foo1, foo2) => foo2.AVC.CompareTo(foo1.AVC));
正如Jon Skeet所说,这里的诀窍是知道false
被认为比'{1}}更小'
如果您发现在代码中的许多不同位置执行这些排序操作,您可能希望让类型true.
实现Foo
和IComparable<Foo>
接口。
答案 2 :(得分:10)
我假设您希望它们按其他东西排序,以便在AVC相同的所有项目之间获得一致的排序。例如,按名称:
var sortedList = list.OrderBy(x => c.AVC).ThenBy(x => x.Name).ToList();