gpt4 book ai didi

c# - 如何像List的Reverse一样实现扩展方法Shuffle而不返回?

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:26 25 4
gpt4 key购买 nike

到目前为止,我有以下 Shuffle 代码,

    public static IList<T> Shuffle<T>(this IList<T> list)
{
var rnd = new Random();
return list.OrderBy(element => rnd.Next());
}

我喜欢用它,

    list = list.Shuffle();

我希望能够像这样使用它

    list.Shuffle(); // like list.Reverse();

所以基本上我想通过引用来洗牌

我试过下面的代码,

    public static void Shuffle<T>(this ref IList<T> list)
{
var rnd = new Random();
list.OrderBy(element => rnd.Next());
}

但它不起作用。

非常感谢任何帮助!

最佳答案

我很久以前就写过这篇文章。可能值得检查链接算法是否正确。众所周知,这类事情很容易出现微妙的错误。

    //Fisher-Yates_shuffle http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
private static readonly ThreadLocal<Random> RandomThreadLocal =
new ThreadLocal<Random>(() => new Random());
public static void Shuffle<T>(this IList<T> list, int seed = -1)
{
var r = seed >= 0 ? new Random(seed) : RandomThreadLocal.Value;
var len = list.Count;
for (var i = len - 1; i >= 1; --i)
{
var j = r.Next(i);
var tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
}

根据下面的评论,可以重载以获得更大的灵 active :

    private static readonly ThreadLocal<Random> RandomThreadLocal =
new ThreadLocal<Random>(() => new Random());
public static void Shuffle<T>(this IList<T> list, int seed)
{
list.Shuffle(new Random(seed));
}

public static void Shuffle<T>(this IList<T> list)
{
list.Shuffle(null);
}

public static void Shuffle<T>(this IList<T> list, Random rand)
{
var r = rand ?? RandomThreadLocal.Value;

var len = list.Count;
for (var i = len - 1; i >= 1; --i)
{
var j = r.Next(i);
var tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
}

关于c# - 如何像List的Reverse一样实现扩展方法Shuffle而不返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com