我有一个对像素进行操作的函数。我想创建一个包含 RGB 值的列表,但是当我这样声明时:
List<int[]> maskPixels = new List<int[3]>();
它给了我错误:
不能在变量声明中指定数组大小(尝试使用“新”表达式进行初始化)
添加像素是这样完成的:maskPixels.Add(new int[] { Red, Green, Blue });
有没有办法做到这一点,或者我必须new List<int[]>();
改用?
没有办法做类似的事情,但既然你用它来表示 RGB 值,你为什么不使用Color
class 代替呢?
List<Color> maskPixels = new List<Color>();
并像这样初始化每个颜色:
Color c = Color.FromArgb(R,G,B); //assuming R,G,B are int values
如果您的值在 0-255 范围内,这是最自然的存储方式。您有预定义的 getter 和 setter 来获取每个颜色分量。
那是不可能的。想一想。当你有一个泛型类型时,比如说List<T>
,T
是一个类型参数,并且对于泛型类型的特定实例,你填写一个 type T
。
但int[3]
不是类型!准确地说,它是array-creation-expression
C# 语法中的一个。
如果您想限制为只能包含三个值的类型,我可以建议您作为第一次切割Tuple<int, int, int>
吗?但更好的是,我推荐一种专用于表示RGB 的类型,例如System.Drawing.Color
(使用Color.FromArgb(int, int, int)
)或您自己的自定义类型(如有必要)。我倾向于后者的原因是因为并非所有Tuple<int, int, int>
都是 RGB 的有效表示!
您不能像这样进行数组初始化,而且int[]
从技术上讲,每个数组的大小都可能不同。不同的数据结构List<Tuple<int, int, int>>
怎么样?
这将允许您在列表中严格包含三个整数值,并且可以通过 LINQ 比数组更快地搜索它,因为它是具有属性的定义明确的结构。
我建议为此使用您自己的值类型:
public struct Rgb
{
int R,
int G,
int B
}
List<Rgb> list = new List<Rgb>;
[Flags]
public enum RGB
{
R,
G,
B
}
...
public List<RGB> l = new List<RGB>();
l.Add(RGB.r | RGB.G)