如何按List<int>对List<Type>排序?C# MVC场景实现
按指定列表顺序对C#集合排序的解决方案
这问题我之前做项目时也碰到过,刚好能用LINQ轻松实现,给你分享两个实用方案,按需选就行:
方案一:直接用OrderBy + IndexOf(简单快速)
这个方法最直观,利用SortValues.IndexOf(fruit.Id)获取每个水果Id在排序列表中的位置,再按这个位置排序:
var sortedFruits = FruitTypes.OrderBy(f => SortValues.IndexOf(f.Id)).ToList();
注意点:
- 要求所有Fruit的Id都在SortValues里存在,如果某个Id不在SortValues中,
IndexOf会返回-1,对应的项会排到最前面 - 适合小数据量场景,因为
IndexOf每次查询是O(n)时间复杂度
方案二:转字典优化性能(大数据量推荐)
如果你的Fruit列表或SortValues比较大,反复调用IndexOf会拖慢性能,这时可以先把SortValues转成Dictionary<int, int>,把Id和它的排序索引对应起来,查询效率直接拉到O(1):
// 先构建排序索引字典 var sortIndexDict = SortValues.Select((id, index) => new { id, index }) .ToDictionary(x => x.id, x => x.index); // 按字典中的索引排序,同时灵活处理不存在的Id(示例中排到最后) var sortedFruits = FruitTypes.OrderBy(f => sortIndexDict.TryGetValue(f.Id, out var index) ? index : int.MaxValue) .ToList();
这个方案不仅性能更好,还能自定义处理不在SortValues里的项——要是想让这类项排到最前面,把int.MaxValue改成int.MinValue就行。
验证结果
按你的示例数据,两种方案排序后的结果都是:
- Pear(Id=5)
- Plum(Id=4)
- Orange(Id=3)
- Banana(Id=1)
- Apple(Id=2)
完全匹配SortValues的顺序~
内容的提问来源于stack exchange,提问作者Skullomania
相关产品推荐
相关产品推荐

