我有一个List,其中T有一个属性CoverImage。我想以随机顺序访问列表中的所有项目,并从服务器加载适当的图像。我对从服务器加载数据不感兴趣,我想知道的是如何以随机的方式访问该列表中的所有元素并且只有一次?
答案 0 :(得分:4)
Random rnd = new Random();
foreach(var elem in list.OrderBy(x => rnd.Next()))
{
}
答案 1 :(得分:2)
适当的术语是 shuffling 。改组是将集合/序列重新排序为随机顺序的概念。
有很多方法可以做到这一点,具有不同的性能影响。一个很好的选择是F isher–Yates shuffle
伪代码:
To shuffle an array a of n elements (indices 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
答案 2 :(得分:0)
Random r = new Random();
List<T> myListRnd = new List<T>();
int p = 0;
while (myList.Count > 0)
{
p = r.Next(myList.Count + 1)
myListRnd.Add(myList[p]);
myList.RemoveAt[p];
}
答案 3 :(得分:0)
如果您有兴趣编写自己的扩展方法,它可能如下所示:
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> enumerable, Random random)
{
List<T> itemList = new List<T>(enumerable);
for (int i = 0; i < itemList.Count; ++i)
{
int randomIndex = random.Next(itemList.Count);
if (randomIndex != i)
{
T temp = itemList[i];
itemList[i] = itemList[randomIndex];
itemList[randomIndex] = temp;
}
}
return itemList;
}