如何生成这个特定的数字序列?

时间:2010-09-24 11:14:49

标签: .net colors numbers sequence

显然,.net中没有预定义列表。

我想使用多种标准颜色,例如类似于红色,绿色,蓝色,黄色......,即由00和FF组成的典型颜色,其次是具有额外7F组件的颜色,...

有没有办法检索这些“标准”颜色,还是我必须自己编写IEnumerable<Color>

编辑:这是RGB值的可能输出。

请注意集合的顺序,因为在添加80之前必须完成00 / FF枚举,并且在添加40 / B0之前必须完成00/80 / FF枚举, 等等。 中的顺序无关紧要(即00 FF 00可能在00 00 FF之前)。

00 00 00 // start out with 00 and FF components
00 00 FF
00 FF 00
FF 00 00
FF FF 00
FF 00 FF
00 FF FF
FF FF FF
00 00 80 // ok, now add 80
00 80 00
...
80 80 80
FF 00 80
FF 80 00
FF 80 80
80 FF 00
80 FF 80
FF FF 80
...
// now add 40 and B0

4 个答案:

答案 0 :(得分:8)

Colors类上有许多预定义的ARGB颜色,Color结构也是如此。这些包含YellowWhiteGreen等内容......

如果您需要用户定义的系统颜色,可以使用SystemColors类,其中包含ActiveBorderWindowText等内容...


更新

框架中没有任何内容可以根据ARGB值对颜色进行排序,因为它没有多大意义

您可以使用Linq按其组件(OrderBy扩展方法)对颜色列表进行排序。

答案 1 :(得分:1)

可能SystemColors课对你来说是正确的。

答案 2 :(得分:1)

AFAIK“标准”颜色不等于基于您描述的图案的RGB值的颜色。例如紫色有#B803FF RGB值(类似'紫红色'有#FF00FF)。

答案 3 :(得分:1)

这是生成序列的一种相当快速的方法:

public static IEnumerable<Color> StandardColors ()
{
    int r = 0;
    int g = 0;
    int b = 0;
    int inc = 0x100;

    yield return Color.FromArgb (0, 0, 0);

    while (true) {
        if (((r | g | b) & inc) != 0) {
            int outR = r == 0 ? 0 : r - 1;
            int outG = g == 0 ? 0 : g - 1;
            int outB = b == 0 ? 0 : b - 1;
            yield return Color.FromArgb (outR, outG, outB);
        }

        r += inc;
        if (r > 256) {
            r = 0;
            g += inc;

            if (g > 256) {
                g = 0;
                b += inc;

                if (b > 256) {
                    b = 0;
                    inc >>= 1;

                    if (inc <= 1) {
                        break;
                    }
                }
            }
        }
    }
}

这当然可以改善。例如,应该避免使用单独的outR / G / B变量,并且应该从奇数(基于inc)值开始递增2 * inc,以避免必须测试该值是否已经早先生成

使用此测试

static void Main (string[] args)
{
    var colors = StandardColorEnumerator.StandardColors ().Take (15)
        .Concat (StandardColorEnumerator.StandardColors ().Skip (1000).Take (10));
    foreach (var color in colors) {
        Console.WriteLine (color.B + "\t" + color.G + "\t" + color.R);
    }

    Console.ReadKey (true);
}

生成以下输出:

0       0       0
0       0       255
0       255     0
0       255     255
255     0       0
255     0       255
255     255     0
255     255     255
0       0       127
0       127     0
0       127     127
0       127     255
0       255     127
127     0       0
127     0       127

15      47      191
15      47      207
15      47      223
15      47      239
15      47      255
15      63      0
15      63      15
15      63      31
15      63      47
15      63      63