如何洗牌 ListT 中的元素?
咨詢區(qū)
mirezus:
是否有一個(gè)最佳的方式對(duì) List<T> 進(jìn)行洗牌排序,我的項(xiàng)目有一個(gè)抽獎(jiǎng)模塊,需要對(duì)一個(gè)有 75個(gè)元素的 List<T> 進(jìn)行隨機(jī)排序,請(qǐng)問大家有什么好的實(shí)現(xiàn)方式。
回答區(qū)
user453230:
如果你僅僅是想對(duì)List中的item進(jìn)行隨機(jī)化排序,我個(gè)人推薦一種高效的方式,那就是按照 GUID 排序,參考如下代碼:
var?shuffledcards?=?cards.OrderBy(a?=>?Guid.NewGuid()).ToList();評(píng)論中有朋友指出了,GUID并不能保證完全隨機(jī)化,所以還有另外一種方式就是使用 Random 類替代,參考如下:
private?static?Random?rng?=?new?Random(); ... var?shuffledcards?=?cards.OrderBy(a?=>?rng.Next()).ToList();Xelights:
如果你不介意使用兩個(gè)List的話,那么我這個(gè)將是最簡(jiǎn)單粗暴的實(shí)現(xiàn)方式,但它不是最高效的。
List<int>?xList?=?new?List<int>()?{?1,?2,?3,?4,?5?}; List<int>?deck?=?new?List<int>();foreach?(int?xInt?in?xList)deck.Insert(random.Next(0,?deck.Count?+?1),?xInt);Shehab Fawzy:
你可以通過 擴(kuò)展方法 的形式實(shí)現(xiàn),首先定義一個(gè)擴(kuò)展方法。
public?static?class?IEnumerableExtensions {public?static?IEnumerable<t>?Randomize<t>(this?IEnumerable<t>?target){Random?r?=?new?Random();return?target.OrderBy(x=>(r.Next()));}???????? }然后可以像下面這樣調(diào)用。
//?use?this?on?any?collection?that?implements?IEnumerable! //?List,?Array,?HashSet,?Collection,?etcList<string>?myList?=?new?List<string>?{?"hello",?"random",?"world",?"foo",?"bar",?"bat",?"baz"?};foreach?(string?s?in?myList.Randomize()) {Console.WriteLine(s); }點(diǎn)評(píng)區(qū)
這個(gè)問題挺有意思,前幾年在項(xiàng)目開發(fā)中還真有這么一個(gè)需求,第一次我采用了 Guid.NewGuid(),但相信用過的朋友都知道,這玩意用起來(lái)真的太慢了,尤其上十萬(wàn)數(shù)據(jù)之后,所以后期采用了 new Random() 的方式。
總結(jié)
以上是生活随笔為你收集整理的如何洗牌 ListT 中的元素?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6 全新指标 System.D
- 下一篇: 聊一聊对外API接口的存活检查可以怎么做