Java Collections.shuffle()在vb.net中是否等效?

Java Collections.shuffle()在vb.net中是否等效?,java,.net,vb.net,Java,.net,Vb.net,vb.net的java.util.Collections.shuffle()方法的等价物是什么?我在MSDN上没有发现任何类似的内容。非常感谢您的帮助。据我所知,没有内置的.NET函数,但使用Linq可以轻松编写通用的等效函数: Function Shuffle(Of T)(collection As IEnumerable(Of T)) As List(Of T) Dim r As Random = New Random() Shuffle = collection.Order

vb.net的
java.util.Collections.shuffle()方法的等价物是什么?我在MSDN上没有发现任何类似的内容。非常感谢您的帮助。

据我所知,没有内置的.NET函数,但使用Linq可以轻松编写通用的等效函数:

Function Shuffle(Of T)(collection As IEnumerable(Of T)) As List(Of T)
    Dim r As Random = New Random()
    Shuffle = collection.OrderBy(Function(a) r.Next()).ToList()
End Function
调用此函数为输入列表中的每个元素分配一个随机值,然后按该随机数排序,返回一个新的(无序)列表

如果集合是一个数组或派生自
IList
,则性能更高的方法可能是使用将列表洗牌到位:

Sub-Shuffle(Of T)(列表为IList(Of T))
尺寸r为随机=新随机()
对于列表中的i=0。计数-1
作为整数的Dim索引=r.Next(i,list.Count)
如果我那时
'交换列表(i)和列表(索引)
尺寸温度为T=列表(i)
列表(i)=列表(索引)
列表(索引)=临时
如果结束
下一个
端接头

我想没有本地版本,但你可以查看这篇文章。他们提出了一些解决方案,调用这个函数会给输入列表中的每个元素分配一个随机值,然后根据那个随机数进行排序。它在每次比较时为元素指定随机数。洗牌算法需要多次与集合中的多个元素进行比较,这将每次使用不同的随机值,这可能会将算法置于意外的位置。事实上,甚至不能保证排序会完成,这可能会产生运行时异常。费舍尔·耶茨与表现无关。这是关于正确性的,并使其真正随机。“那不是真的。它在每次比较时为元素分配随机数”。事实上,这是真的,但事实并非如此。我已经专门测试了这个“问题”,它不是一个问题。在使用
OrderBy的情况下,它按照@drf的描述工作,即每个项目生成一个值,并根据这些值对列表进行排序。当您调用一个
Sort
方法,该方法接受一个直接执行两项比较的对象或委托时,您所描述的内容就会成为一个问题。例如,当传递
i比较者(T的)
对象或
比较(T的)
委托时
OrderBy
这样很好用。很有趣。快速查看MSDN文档,似乎
OrderBy
规范没有专门针对不确定性排序函数的情况;参考源似乎显示排序是稳定的,因为内部类
EnumerableSorter
碰巧对每个项调用一次键选择器。在C#)
var r=new Random()中使用类似的代码可能更安全;返回l.Select(i=>new{Value=i,SortKey=r.Next()}).OrderBy(i=>i.SortKey).Select(i=>i.Value).ToList(),如果只是为了阐明意图并避免依赖于实现细节。