使用外部优先级列表对项目进行任意排序

时间:2019-03-19 09:19:39

标签: c# linq sorting

我有一个像这样的独特商品列表:

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做到这一点吗?

2 个答案:

答案 0 :(得分:6)

您可以通过其他列表中的索引对项目进行排序:

var orderedList = ItemList.OrderBy(i => PriorityList.IndexOf(i)).ToList();

但是,如果某项恰好不在 优先级列表中,则该项将排在第一位,因为IndexOf会为该项返回-1不存在。如果您希望它们排在最后,则可以检查列表中是否首先包含该项目,如果不包含,则返回较大的数字,例如int.MaxValuePriorityList.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以避免多次枚举结果。)