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