你知道如何取消列表或数组的排序吗

本文关键字:列表 数组 排序 取消 何取消 | 更新日期: 2023-09-27 18:20:45

我记得看到一个方法似乎是bubble排序,在那里可以取消排序项。

例如,我试图使用Random类显示从0到10的随机化项目。但我想这不是最好的选择。

所以,我想为IEnumberable、List或array创建一个扩展是最好的方法。

你知道如何取消列表或数组的排序吗

您正在寻找一个shuffle,随机重新排序的一个很好的例子是Fisher Yates shuffle。

以下是Jon Skeet在C#中的一个实现。

看起来像冒泡排序的算法是:

for i= 0:(len(x)-1):
    j = random(i,len(x)-1)
    swap(x[i],x[j])

假设random(a=c<b.

这个算法被称为"Fisher—Yates Shuffle"。

FWIW,您不能"真正"用标准的内置随机数生成器洗牌一个大数组。21项混洗具有65位的熵,其中大多数RNG是64位或32位。

这将给您一个从0到10(包括10)的随机值:

int[] randomNumbers = Shuffle(Enumerable.Range(0, 11), new Random()).ToArray(); 
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random random)
{
    T[] list = source.ToArray();
    int count = list.Length;
    while (count > 1)
    {
        int index = random.Next(count--);
        T temp = list[index];
        list[index] = list[count];
        list[count] = temp;
    }
    return list;
}

您可以使用linq。。。

var result = Enumerable.Range(0,10).OrderBy( n=> Guid.NewGuid() )

有趣的问题,我建议离开工作岗位

IEnumerable<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random rnd = new Random();
list = list.Select(i => new { value = i, rank = rnd.Next(list.Count()) }).OrderBy(n => n.rank).Select(n => n.value);