Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问列表中的所有项目<;T>;以随机顺序_C#_.net 4.5 - Fatal编程技术网

C# 访问列表中的所有项目<;T>;以随机顺序

C# 访问列表中的所有项目<;T>;以随机顺序,c#,.net-4.5,C#,.net 4.5,我有一个列表,其中T有一个属性CoverImage。我想以随机顺序访问列表中的所有项目,并从服务器加载相应的映像。我对从服务器加载数据不感兴趣,我只想知道如何以随机方式访问该列表中的所有元素,并且只访问一次?这方面的合适术语是洗牌。洗牌是将集合/序列重新排序为随机顺序的概念 Random rnd = new Random(); foreach(var elem in list.OrderBy(x => rnd.Next())) { } 实现这一点的方法有很多,但对性能的影响各不相同。一

我有一个列表,其中T有一个属性CoverImage。我想以随机顺序访问列表中的所有项目,并从服务器加载相应的映像。我对从服务器加载数据不感兴趣,我只想知道如何以随机方式访问该列表中的所有元素,并且只访问一次?

这方面的合适术语是洗牌。洗牌是将集合/序列重新排序为随机顺序的概念

Random rnd = new Random();
foreach(var elem in list.OrderBy(x => rnd.Next()))
{

}
实现这一点的方法有很多,但对性能的影响各不相同。一个很好的选择是F

伪代码:

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]

对此,合适的术语是洗牌。洗牌是将集合/序列重新排序为随机顺序的概念

实现这一点的方法有很多,但对性能的影响各不相同。一个很好的选择是F

伪代码:

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]
Random r=new Random();
List myListRnd=新列表();
int p=0;
而(myList.Count>0)
{
p=r.Next(myList.Count+1)
myListRnd.Add(myList[p]);
myList.RemoveAt[p];
}
Random r=new Random();
List myListRnd=新列表();
int p=0;
而(myList.Count>0)
{
p=r.Next(myList.Count+1)
myListRnd.Add(myList[p]);
myList.RemoveAt[p];
}

如果您对编写自己的扩展方法感兴趣,它可能如下所示:

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;
}
公共静态IEnumerable Shuffle(此IEnumerable可枚举,随机)
{
列表项列表=新列表(可枚举);
对于(int i=0;i
如果您对编写自己的扩展方法感兴趣,它可能如下所示:

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;
}
公共静态IEnumerable Shuffle(此IEnumerable可枚举,随机)
{
列表项列表=新列表(可枚举);
对于(int i=0;i
或者只是为了洗牌,
list.OrderBy(x=>rnd.Next())
@Rati\Ge它的速度是O(n*log(n))。这很简单,可以将O(n)从洗牌中去掉。洗牌时,同样重要的是确保它是“公平的”,并且它不会对序列中某些项目的高/低产生偏差。@I4V好吧,我不会说性能最好。我链接到的维基百科页面显示了其他可能更快的页面,但它们都具有相同的O(n)大oh值。可以改进的是平均情况(与最坏情况相反)或较低粒度下的速度。@I4V,我希望您在回答中添加一些内容,说明有更好的选项可用,也许可以提及其中一个,如果您手头拮据,对性能代码的需求相对较低(小输入等),这肯定会奏效。如果你这样做,我会删除我给你的否决票。@I4V当回答者认为他们不需要做出好的回答时,这些评论会“修正”它,然后是的,我会对其中许多答案发表评论。对于那些花了大量时间和精力来写正确、详细和写得好的答案的人,我发现我的评论更少。或者只是随便乱翻,
list.OrderBy(x=>rnd.Next())
@Rati\u Ge它的速度是O(n*log(n))。这很简单,可以将O(n)从洗牌中去掉。洗牌时,同样重要的是确保它是“公平的”,并且它不会对序列中某些项目的高/低产生偏差。@I4V好吧,我不会说性能最好。我链接到的维基百科页面显示了其他可能更快的页面,但它们都具有相同的O(n)大oh值。可以改进的是平均情况(与最坏情况相反)或较低粒度下的速度。@I4V,我希望您在回答中添加一些内容,说明有更好的选项可用,也许可以提及其中一个,如果您手头拮据,对性能代码的需求相对较低(小输入等),这肯定会奏效。如果你这样做,我会删除我给你的否决票。@I4V当回答者认为他们不需要做出好的回答时,这些评论会“修正”它,然后是的,我会对其中许多答案发表评论。对于那些需要花费大量时间和精力来编写正确、详细和写得好的答案的人,我发现我的评论较少。如果你不想修改原始列表,请创建一个0-n的新整数数组,洗牌该数组,然后使用值列表[index[I]]迭代该数组,如果你不想修改原始列表,创建一个0-n的新整数数组,洗牌该数组,然后使用值列表[index[i]]迭代该数组,很有可能会遇到IndexOutOfRangeException。如果我的列表中有10个项目,则使用Count+1得到一个小于11的数字。这个数字可能是10。但是,列表中的最大索引将是9。还要注意,从
列表中的任意位置删除项目是无效的,这是一个O(n^2)算法。运行IndexOutOfRangeException的概率相当高。如果我的列表中有10个项目,则使用Count+1得到一个小于11的数字。这个数字可能是10。但是,列表中的最大索引将为9。还要注意,从
列表中的任意位置删除项目是无效的,这是一个O(n^2)算法。好的,但我不想修改原始列表。我只想随机访问其元素。我想为使用async/await的图像加载创建淡入效果,所以在e中有一些不错的马赛克淡入效果