【问题标题】: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 的原始顺序不是由于名称的字母顺序,而是插入列表的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-18
        • 2018-09-15
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        相关资源
        最近更新 更多