我有一个像这样的独特商品列表:
List<Animals> ItemList = Cat, Dog, Bird, ...
我正在尝试使用如下所示的外部优先级列表对其进行排序:
List<Animals> PriorityList = Dog, Cat, Bird, ...
我发现我可以用这种方式正确地对项目进行排序:
ItemList.OrderBy(i => i == Dog).ThenBy(i => i.Cat).ThenBy(i => i.Bird)...
但是这种方法的可扩展性非常糟糕;有人知道如何使用LINQ和PriorityList做到这一点吗?
答案 0 :(得分:6)
您可以通过其他列表中的索引对项目进行排序:
var orderedList = ItemList.OrderBy(i => PriorityList.IndexOf(i)).ToList();
但是,如果某项恰好不在 优先级列表中,则该项将排在第一位,因为IndexOf
会为该项返回-1
不存在。如果您希望它们排在最后,则可以检查列表中是否首先包含该项目,如果不包含,则返回较大的数字,例如int.MaxValue
或PriorityList.Count
:
var ordered = items
.OrderBy(i => priorities.Contains(i) ? priorities.IndexOf(i) : int.MaxValue)
.ToList();
答案 1 :(得分:1)
如果查找优先级的成本很高(请记住有 O(n log n)个比较,每个比较有两个查找),则可以执行一次查找是一种选择。元组避免了创建用于保存中间结果的类型的需要。
var ordered = ItemList
.Select(i => (item: i, priority: PriorityList.IndexOf(i))
.OrderBy(i => i.priority)
.Select(i => i.item)
.ToList();
(我在这里使用ToList
以避免多次枚举结果。)