【发布时间】:2010-10-23 11:57:20
【问题描述】:
我想在 C# 中对列表进行排序。
就像结构属性 AVC 变为 true 然后先显示它们,然后 AVC 变为 false。有什么方法可以在 C# LINQ 中做到这一点?
【问题讨论】:
我想在 C# 中对列表进行排序。
就像结构属性 AVC 变为 true 然后先显示它们,然后 AVC 变为 false。有什么方法可以在 C# LINQ 中做到这一点?
【问题讨论】:
嗯,使用 LINQ 的最简单方法是这样的:
list = list.OrderBy(x => x.AVC ? 0 : 1)
.ToList();
或
list = list.OrderByDescending(x => x.AVC)
.ToList();
我相信bool值的自然顺序是false < true,但第一种形式让IMO更清楚,因为每个人都知道0 < 1。
请注意,这不会对原始列表本身进行排序 - 它会创建一个新列表,并将引用分配回list 变量。如果要就地排序,应该使用List<T>.Sort方法。
【讨论】:
list 的编译时类型是List<T>。否则,您将尝试将 IEnumerable<T> 分配给 LIst<T> 变量。如果你只需要一个序列,每次迭代它时都会懒惰地评估它,你就不需要它。
OrderBy 返回一个序列,而不是一个列表。听起来你应该问一个新问题来证明你的问题。
像这样?
在 LINQ 中:
var sortedList = originalList.OrderBy(foo => !foo.AVC)
.ToList();
或就地:
originalList.Sort((foo1, foo2) => foo2.AVC.CompareTo(foo1.AVC));
正如 Jon Skeet 所说,这里的诀窍是知道 false 被认为比 true.“小”
如果您发现您在代码中的许多不同位置执行这些排序操作,您可能希望使用您的类型 Foo 来实现 IComparable<Foo> 和 IComparable 接口。
【讨论】:
我假设您还希望它们按其他方式排序,以便在 AVC 相同的所有项目之间获得一致的排序。例如按名称:
var sortedList = list.OrderBy(x => c.AVC).ThenBy(x => x.Name).ToList();
【讨论】:
已接受答案的替代语法:
list = from item in list
orderby item.AVC
select item;
请记住,“列表”现在是 IEnumerable 对象,而不是 List 对象。
【讨论】: