【问题标题】:Simple way to randomly shuffle list [duplicate]随机打乱列表的简单方法[重复]
【发布时间】:2018-03-30 07:23:40
【问题描述】:

我有一个颜色列表,我想至少稍微混合一下。

我创建一个列表使用

 List<Color> colors = new List<Color> ();
 colors.Add(Color.Black);
 colors.Add(Color.White);
 colors.Add(Color.Red);

但是没有.Shuffle 我注意到.Sort 但我认为这不是我需要的。我搜索了一段时间,但如果有更简单的方法,我发现的所有方法和其他问题对于如此简单的任务似乎都过于复杂了。

我尝试过使用

List<Color> colorList = new List<Color>();
public void SetupColors()
    {
        List<Color> colors = new List<Color> ();
        colors.Add(Color.BLACK);
        colors.Add(Color.WHITE);
        colors.Add(Color.RED);
        Random random = new Random();
        int n = colors.Count;

        for (int i = colors.Count; i > 1; i--)
        {
            int rnd = random.Next(i + 1);

            var value = colors[rnd];
            colors[rnd] = colors[i];
            colors[i] = value;
        }
        colorList = colors;
    }

    public List<Message> getMessages()
    {
        List<Message> items = new List<Message>
        {
            new Message
            {
                . . . 
                Background = colorList[0]
            },
            new Message
            {
                . . . 
                Background = colorList[1]
            }
        };

        return items;
    }

但我在colorList[0]colorList[1] 不断收到IndexBound 错误

【问题讨论】:

  • 看看Fisher-Yates shuffle算法
  • 我看到了“重复”的帖子,但答案比他们需要的更复杂,必须有一种更简单的方法来洗牌

标签: c# xamarin xamarin.forms


【解决方案1】:

试试这个(基于 Fisher-Yates shuffle 算法)

public static void ShuffleMe<T>(this IList<T> list)  
{  
    Random random = new Random();  
    int n = list.Count;  

    for(int i= list.Count - 1; i > 1; i--)
    {
        int rnd = random.Next(i + 1);  

        T value = list[rnd];  
        list[rnd] = list[i];  
        list[i] = value;
    }
}

List<Color> colors = new List<Color> ();
colors.Add(Color.Black);
colors.Add(Color.White);
colors.Add(Color.Red);

colors.ShuffleMe();

【讨论】:

  • 我将尝试编辑到问题中,但我不断收到 IndexBound 错误
  • 编辑 for 循环: for (int i = colors.Count - 1; i > 1; i--) 。我也更新了答案。如果它有用并点赞,请标记为答案。
  • 运行时没有错误。我测试了它。你在哪里得到错误?也没有必要这样做 colorList = colors;
  • 刚刚注意到我在运行 SetupColors 之前运行了 getMessages
  • int n 未使用。这是故意的吗? @GaurangDave
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多