【问题标题】:Sort List in Random Alphabetical Order按随机字母顺序排序列表
【发布时间】:2022-11-18 02:10:57
【问题描述】:
我有一个班级Tester,定义是
public class Tester
{
public string Name;
public int TaskCount;
public Tester(string name, int taskCount)
{
Name = name;
TaskCount = taskCount;
}
}
,我被要求实现一种方法,按照 TaskCount 的升序对 Tester 对象列表进行排序。
例如,我在列表中有 3 个 Tester 对象:new Tester("A", 1)、new Tester("B", 5)、new Tester("C", 1),如果我只是使用默认的 OrderBy 方法按 TaskCount 对它们进行排序,列表将始终看起来喜欢:
A (TaskCount: 1)
C (TaskCount: 1)
B (TaskCount: 5)
因为按字母顺序,字母“A”总是在“C”之前。有没有一种方法可以让我按随机字母顺序对列表进行排序,同时它仍然按 TaskCount 的升序排列,因此结果看起来像 ACB 的可能性为 50%,而结果看起来像 CAB 的可能性为 50%?先感谢您!
【问题讨论】:
标签:
c#
list
sorting
compare
comparator
【解决方案1】:
如果比较包含一些“随机”成分,则很难让 sort 表现良好。特别是,对于大多数排序算法,您必须确保“if a < b than b > a”——要实现这一点,“随机”需要跟踪这些算法最初是如何比较的。
我建议将排序和随机化分开——因为看起来您只想随机化每个“TaskCount”的顺序,每个桶的随机化不会干扰整体排序。
一线解决方案(随机化使用 Randomize a List<T> 中的 Shuffle,但如果性能无关紧要,您可以使用较慢的版本,如按 GIUD 排序):
var result = list.GroupBy(x => x.TaskCount)
.Select(g => g.OrderBy(x => x.Shuffle())
.SelectMany(x=>x)
.ToList();
【解决方案2】:
您可以在初始排序后使用随机数生成器进行后续排序。
List<Tester> lt = new List<Tester>();
lt.Add(new Tester("C", 1));
lt.Add(new Tester("B", 5));
lt.Add(new Tester("A", 1));
lt.Add(new Tester("D", 5));
Random r = new Random();
Console.WriteLine(lt.OrderBy(x => x.TaskCount).ThenBy(x => r.Next()));
OrderBy 会将 Tester 实例放入 TaskCount 顺序,ThenBy 将随机化那些具有相同 TaskCount 值的实例。
注意 - A、C、B 的原始顺序不是由于名称的字母顺序,而是插入列表的顺序。