C# 按字段顺序排列列表,然后按随机顺序排列

C# 按字段顺序排列列表,然后按随机顺序排列,c#,linq,sorting,random,C#,Linq,Sorting,Random,按“年龄”然后按随机顺序排列列表的更好方法是什么 我的目标是确保如果PersonA age=PersonB age,那么PersonA在某些情况下会排在第一位,PersonB在某些情况下会排在第一位。最简单的答案是先洗牌,然后排序。如果使用稳定排序,则排序必须保留相等键控值的无序顺序。然而,即使一个不稳定的排序会扰乱你的洗牌,我想不出任何合理的情况下,它可以取消洗牌相等的键控值 这可能有点低效,不过 如果你担心碰撞,我可以假设你的年龄是以年为单位的整数年龄。在这种情况下,您可能会考虑基数排序(2

按“年龄”然后按随机顺序排列列表的更好方法是什么


我的目标是确保如果PersonA age=PersonB age,那么PersonA在某些情况下会排在第一位,PersonB在某些情况下会排在第一位。

最简单的答案是先洗牌,然后排序。如果使用稳定排序,则排序必须保留相等键控值的无序顺序。然而,即使一个不稳定的排序会扰乱你的洗牌,我想不出任何合理的情况下,它可以取消洗牌相等的键控值

这可能有点低效,不过

如果你担心碰撞,我可以假设你的年龄是以年为单位的整数年龄。在这种情况下,您可能会考虑基数排序(256个bin对于任何活着的人来说都足够了),并且当需要将这些容器重新缝合在一起时,您将在将它们附加到列表中时以任意顺序从每个bin中移除元素。 如果您的列表已经按年龄排序,并且您只想在适当的位置进行洗牌,那么您只需要在列表中迭代,计算以下元素的数量相等,对这些元素执行适当的洗牌,然后前进到下一个不匹配的元素并重复

我想后者应该是这样的(我会用C写,因为我不懂C):

inti=0;
while(i

还没有测试过它,但它应该给出大致的想法。

使用SQL中的技术

int i = 0;
while (i < a.length) {
  int j;
  while (a[j] == a[i] && j < a.length) j++;
  while (i + 1 < j) {
    int k = random(j - i) + i;
    swap(a[i], a[k]);
    i++;
  }
  i++;
}

警告:这不是真正的随机,只是一种懒惰的方法,请参阅问题的评论部分

随机排序不是排序,而是洗牌。我认为按年龄分组,然后对分组进行洗牌可能是一种更好的方法。@MattBurland所以我的目标是“排序”,然后“洗牌”只能相等values@Max,请参见下面的shuffle:Shuffling列表似乎并不难,但我希望保持列表的顺序。我只想洗牌相等的值。我无法理解。如果你只是按年龄排序,那么你应该得到你想要的结果。如果
Age
值相等,则无法保证它们的顺序。
int i = 0;
while (i < a.length) {
  int j;
  while (a[j] == a[i] && j < a.length) j++;
  while (i + 1 < j) {
    int k = random(j - i) + i;
    swap(a[i], a[k]);
    i++;
  }
  i++;
}
var orderedList = aListOfPeople.OrderBy(x => x.Age).ThenBy(x => Guid.NewGuid());