如何将颜色数组设置为另一个颜色数组?

时间:2009-06-16 13:43:12

标签: c# .net asp.net arrays

我的下面的代码给了我错误:“索引超出了数组的范围。”我的算法创建的Colorset数组的数组维数为'16', 但是我需要第二个'colorSetLegend'这个尺寸:32如果你看下面的粗体代码会给我带来错误。

 Color[] colorSetLegend = new Color[32];
            Color[] colorSet = { Color.Red, Color.Blue, Color.Green, Color.Yellow };
            Color end = Color.White;
            colorSet = ColorMaker.GenerateColor(colorSet, end);

            for (int i = 0; i < colorSet.Length; )
            {
                for (int j = 0; j < colorSetLegend.Length; )
                {
                    colorSetLegend[j] = colorSet[i];
                    colorSetLegend[j++] = Color.Black;
                    i++;
                }
            }

我的颜色生成器如下:


public class ColorMaker
{
    public static Color[] GenerateColor(Color[] baseColorSet, Color end)
    {
        Color[] colorSet = new Color[16];
        int j = 0;
        foreach (Color start in baseColorSet)
        {
            for (int i = 0; i < 15; i += 4)
            {
                int r = Interpolate(start.R, end.R, 15, i),
                    g = Interpolate(start.G, end.G, 15, i),
                    b = Interpolate(start.B, end.B, 15, i);

                colorSet[j] = Color.FromArgb(r, g, b);
                j++;
            }
        }

        return colorSet;

    }
    static int Interpolate(int start, int end, int steps, int count)
    {
        float s = start, e = end, final = s + (((e - s) / steps) * count);
        return (int)final;
    }
}

2 个答案:

答案 0 :(得分:2)

你在内部循环中递增i。我怀疑你打算在外部循环中执行此操作 - 否则在外部循环的一次迭代期间,您需要多次递增i,直到超过数组的边界。

或者,您可以像其他人一样编写for循环:

for (int i = 0; i < colorSet.Length; i++)
{
    for (int j = 0; j < colorSetLegend.Length; j++)
    {
        colorSetLegend[j] = colorSet[i];
        colorSetLegend[j] = Color.Black;
    }
}

话虽如此,如果循环中的第一行设置colorSetLegend[j]而第二行再次设置相同的元素,则代码有点无意义。此外,在外循环的下一次迭代中,您将重新覆盖colorSetLegend中的所有值。你想要完成什么?

Marc对你的目标做了一个好看的猜测(尽管他现在已经删除了他的答案!)

这是他对你想要的工作代码的猜测:

for (int i = 0; i < colorSet.Length; i++)
{
    colorSetLegend[i*2] = colorSet[i];
    colorSetLegend[(i*2)+1] = Color.Black;
}

如果他是对的,可以从中学到一些东西:

  • 考虑循环的嵌套级别。你真的想在这里有两个循环吗?
  • 尝试使用传统习语进行循环 - 每当我在for循环开始时看到空位时,我就会感到紧张
  • 在另一个表达式中使用前后增量运算符很容易出错。

答案 1 :(得分:0)

这将实现您的目标:

int j = 0;
for (int i = 0; i < colorSet.Length; i++)
{
    colorSetLegend[j++] = colorSet[i];
    colorSetLegend[j++] = Color.Black;
}