如何在按TaskCount升序排序时随机排列同值Tester对象的Name顺序?
实现按TaskCount升序且同值元素随机排序的方法
你提到默认OrderBy按TaskCount排序后同值元素顺序固定,本质是因为.NET的OrderBy是稳定排序——当元素的排序键(这里是TaskCount)相等时,会保留它们在原列表中的相对顺序,并非按Name排序(你例子里A在前只是因为它在原列表中先出现)。
要实现同TaskCount的元素随机排序,有两种简单可行的方式:
方法一:用ThenBy附加随机排序键
先按TaskCount升序排序,再给每个元素分配一个随机数作为次级排序键,让同组元素基于随机数打乱顺序:
var random = new Random(); var sortedTesters = testers .OrderBy(t => t.TaskCount) .ThenBy(t => random.Next()) .ToList();
注意:必须提前创建一个Random实例,不要在ThenBy的委托里直接new Random()——短时间内多次创建Random会使用相同的系统时间种子,导致生成重复的随机数,失去随机效果。
方法二:分组后每组内随机排序
先按TaskCount将元素分组,对每组内的元素单独随机排序,再按TaskCount升序合并各组:
var random = new Random(); var sortedTesters = testers .GroupBy(t => t.TaskCount) .OrderBy(g => g.Key) .SelectMany(group => group.OrderBy(_ => random.Next())) .ToList();
这两种方法都能保证TaskCount升序的前提下,同值元素的顺序随机,你的例子中A和C会有50%概率呈现ACB或CAB的排列。
内容的提问来源于stack exchange,提问作者Emory Lu
相关产品推荐
相关产品推荐

