C# 在.NET中搜索匹配颜色数组的最快方法

C# 在.NET中搜索匹配颜色数组的最快方法,c#,.net,bitmap,C#,.net,Bitmap,我正在使用位图中的GetPixel(使用锁定位,因此没有效率问题),需要尽可能快地搜索颜色数组中颜色的位置。我有非常大的位图要迭代 ... prevColor = Color.FromArgb(255, r, g, b); int count = 1536; for (int i = 0; i < count; i++) { if (prevColor == theColorScale[i]) { loc = i;

我正在使用位图中的GetPixel(使用锁定位,因此没有效率问题),需要尽可能快地搜索颜色数组中颜色的位置。我有非常大的位图要迭代

...                
prevColor = Color.FromArgb(255, r, g, b);

int count = 1536;
for (int i = 0; i < count; i++)
{
   if (prevColor == theColorScale[i])
   {
       loc = i;
       break;
   }
}
。。。
prevColor=Color.FromArgb(255,r,g,b);
整数计数=1536;
for(int i=0;i

有什么建议吗?

您能使用列表并使用.IndexOf()进行搜索吗

。。。
列表色阶;
/*添加颜色*/
loc=色标索引(prevColor);

您可以使用列表并使用.IndexOf()进行搜索吗

。。。
列表色阶;
/*添加颜色*/
loc=色标索引(prevColor);

接受所述问题

字典有O(1)查找

Dictionary colors=newdictionary();
...
loc=颜色[prevColor];

字典中的键(颜色)必须是唯一的

接受所述问题

字典有O(1)查找

Dictionary colors=newdictionary();
...
loc=颜色[prevColor];


字典中的键(颜色)必须是唯一的

为什么要将颜色保留在数组中而不是哈希映射或字典中?为了扩展Renans的回答:我建议使用HybridDictionary,它可以在哈希表变大时启动一个字典并更改哈希表(以提高性能)。请注意,在c#(我认为是java)中不存在Hashmap,但OP请求位置,HashSet是unordered@Blam闻起来像是糟糕的设计。如果您想使用索引结构对颜色进行操作,您可能不知道如何使用颜色空间,应该重新考虑您正在执行的操作。如果有帮助,颜色数组是一个插值颜色数组。红色>黄色>绿色>蓝色>紫色为什么要将颜色保留在数组中而不是哈希表或字典中?为了扩展Renans的回答:我建议使用混合字典,它可以启动一个单词,并在哈希表变大时更改哈希表(为了性能)。请注意,在c#(我认为是java)中不存在Hashmap,但OP请求位置,HashSet是unordered@Blam闻起来像是糟糕的设计。如果您想使用索引结构对颜色进行操作,您可能不知道如何使用颜色空间,应该重新考虑您正在执行的操作。如果有帮助,颜色数组是一个插值颜色数组。红色>黄色>绿色>蓝色>紫色问题是
最快的方法
这是O(n)你知道,我不是反对这个,而是很迂腐,这远远不是搜索你想要的东西的最有效的方式。他们想要快速,但事实上他们想要索引已经很低效了。我不确定他们剩下的代码是如何设置的,所以我只花了2分钱就找到了一个更快的方法来获取索引(不管他们出于什么原因需要它)*编辑:现在我看得更多了,如果他们坚持使用索引,我想这是一个家庭作业。如果他们不介意改变它,那么有更快的方法,就像我说的,我只是在学究。IndexOf不会比OP已经在做的循环解圈快。这是特别可行的,因为他的数组是固定大小的,正如他在评论中所说。好吧,直到现在,我还不知道效率是O(n)顺便说一句。问题是
最快的方法
这是O(n)你知道,我不反对这个,但我很迂腐,这远远不是搜索你想要的东西的最有效的方法。他们想要快速,但事实上,他们想要索引,这已经是低效的了。我不确定他们剩下的代码是如何设置的,所以我只花了2分钱就找到了一个更快的方法来获取索引(不管他们出于什么原因需要它)*编辑:现在我看得更多了,如果他们坚持使用索引,我想这是一个家庭作业。如果他们不介意改变它,那么有更快的方法,就像我说的,我只是在学究。IndexOf不会比OP已经在做的循环解圈快。这是特别可行的,因为他的数组是固定大小的,正如他在评论中所说。直到现在,我还不知道效率是O(n)btw。我假设OP不会对颜色进行任何复杂的操作,所以这基本上也是我的答案+1.我假设OP不会对颜色进行任何复杂的操作,所以这基本上也是我的答案+1.
...
List<Color> colorScale;
/* add colors */
loc = colorScale.IndexOf(prevColor);
Dictionary<color, Int32> colors = new Dictionary<color, Int32>();
...
loc = colors[prevColor];