【问题标题】:Select a random color, except certain colors选择一种随机颜色,某些颜色除外
【发布时间】:2015-08-16 13:01:24
【问题描述】:

我目前正在使用此代码:

Random randomColor = new Random();
KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomColor.Next(names.Length)];
Color RandomColor = Color.FromKnownColor(randomColorName);
this.BackColor = RandomColor;

我正在使用它来生成随机颜色并将其设置为我的背景,但我不希望它变黑。

有没有办法从可能的随机颜色中去除黑色?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    选项 1: 只需使用 List 的 Remove 方法:

    List<KnownColor> namesList = new List<KnownColor>((KnownColor[])Enum.GetValues(typeof(KnownColor)));
    namesList.Remove(KnownColor.Black);
    KnownColor[] names = namesList.ToArray();
    

    选项 2: 仅使用列表。它们比数组有更多的管理可能性:

    Random randomColor = new Random();
    List<KnownColor> names = new List<KnownColor>((KnownColor[])Enum.GetValues(typeof(KnownColor)));
    names.Remove(KnownColor.Black);
    this.BackColor = Color.FromKnownColor(names[randomColor.Next(names.Count)]);
    

    补充:您还可以删除所有黑色但未命名为黑色的颜色(例如ActiveCaption):

    List<KnownColor> names = new List<KnownColor>((KnownColor[])Enum.GetValues(typeof(KnownColor)));
    foreach (KnownColor i in names)
    {
        if (Color.FromKnownColor(i).ToArgb() == Color.Black.ToArgb()) names.Remove(i);
    }
    

    【讨论】:

      【解决方案2】:

      最快和最有效的方法是:

      Random rng = new Random();
      public Color randomColor()
      {
          Color.FromArgb(rng.Next(-16777216, -1));
      }
      

      这将创建一个没有黑色的随机颜色。它之所以有效,是因为颜色类将颜色保存为黑色为 0 的整数。

      【讨论】:

        【解决方案3】:

        以下是我如何从 KnownColor 过滤颜色(在本例中,我从颜色列表中删除黑色和白色)并返回随机颜色:

        private Color getRandomColor()
            {
                Random randomGen = new Random();
        
                KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
                KnownColor[] badColors = { KnownColor.Black, KnownColor.White };
        
                IEnumerable<KnownColor> colors = names.Except(badColors);
        
                KnownColor[] okColors = colors.ToArray();
                KnownColor randomColorName = okColors[randomGen.Next(names.Length)];
        
                return Color.FromKnownColor(randomColorName);
            }
        

        【讨论】:

          猜你喜欢
          • 2014-06-12
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 2011-07-07
          相关资源
          最近更新 更多