将数组添加到列表会覆盖以前的元素

时间:2014-08-07 09:37:26

标签: c# list

我试图通过迭代所有可能的颜色组合并将每个值添加到list来创建简单的颜色渐变位图。每个RGB个值都存储为主int中的list数组。

当我尝试add数组到list时,会出现问题。它会覆盖list中的所有先前条目,最后我得到一个充满颜色数组的列表,所有颜色数组都填充了255.我知道必须存在一种更好的方法来创建一个色谱位图而不是笨重的方式,但我对它为什么会这样表现很感兴趣。

int[] temp = new int[3];
for (int r = 0; r < 256; r++)
{
    for (int g = 0; g < 256; g++)
    {
        for (int b = 0; b < 256; b++)
        {
            temp[0] = r;
            temp[1] = g;
            temp[2] = b;
            colors.Add(temp);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

你的问题是temp是一个数组,数组是引用类型。当您对其进行更改时,它会反映在以前添加的颜色值中。

你需要做

for (int r = 0; r < 256; r++)
{
    for (int g = 0; g < 256; g++)
    {
        for (int b = 0; b < 256; b++)
        {
            int[] temp = new int[3];
            temp[0] = r;
            temp[1] = g;
            temp[2] = b;
            colors.Add(temp);
        }
    }
}

这样每个temp都是一个全新的实例,colors的所有值都会不同。

答案 1 :(得分:2)

用户NikhilAgrawal的回答是正确的,我建议您在Color命名空间中使用专用的System.Drawing结构。结果得到many useful methods and operators for free

您的代码变为:

List<Color> colors = new List<Color>();
for (int r = 0; r < 256; r++)
{
    for (int g = 0; g < 256; g++)
    {
        for (int b = 0; b < 256; b++)
        {
            colors.Add(Color.FromArgb(r,g,b));
        }
    }
}