基于LINQ实现带优先项的按整数排序问题求助
问题分析与解决方案
单个优先项排序的错误原因
你写的排序代码OrderBy(x => x.Item1.Equals("Apple"))之所以没生效,是因为C#中bool类型的排序规则是**false(对应数值0)排在true(对应数值1)前面**。当判断x.Item1.Equals("Apple")时,Apple会返回true,其他水果返回false,所以OrderBy会把返回false的水果(Banana、Coconut)排在前面,Apple反而被挤到后面,和你想要的效果完全相反。
修正后的单个优先项排序代码
把判断逻辑取反,让优先项返回false(排在前面),非优先项返回true(排在后面),再结合分数降序排序:
IEnumerable<Tuple<String, int>> sortedWithPreference = allFruits .OrderBy(x => !x.Item1.Equals("Apple")) .ThenByDescending(x => x.Item2);
这样就能得到Apple, Coconut, Banana的正确结果。
多个优先项的通用解决方案
如果有N个优先名称(比如要把所有Apple相关项排在顶部),可以用一个集合存储优先名称,同样通过取反判断来控制排序优先级,再统一按分数降序:
示例代码
// 定义优先名称集合(支持多个) var preferredNames = new HashSet<string> { "Apple" }; // 待排序列表 var fruitList = new List<Tuple<string, int>> { Tuple.Create("Apple", 1), Tuple.Create("Apple", 2), Tuple.Create("Banana", 3), Tuple.Create("Coconut", 4) }; // 最终排序逻辑 var sortedFruits = fruitList .OrderBy(x => !preferredNames.Contains(x.Item1)) .ThenByDescending(x => x.Item2);
执行后会得到你期望的结果:
- Apple, 2
- Apple, 1
- Coconut, 4
- Banana, 3
逻辑说明
OrderBy(x => !preferredNames.Contains(x.Item1)):所有优先项返回false(0),非优先项返回true(1),确保优先项整体排在顶部。ThenByDescending(x => x.Item2):无论是优先组还是非优先组,内部都按分数从高到低排序。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

