2012-04-01 95 views
4

我有一个字典存储用于OCR用途的模式图像。我从字典中抓取这些位图,并将其与从图像中裁剪出的图像进行比较,如果它们匹配=>抓住关键字(OCR部分完成)。在C#字典中为一个键添加多个位图值

问题出现在这里。一个密钥应该由几个不同的位图(即值)表示。 如何向字典中添加多个位图来表示相同的密钥?

这就是我如何使用字典:

Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>(); 
    lookup.Add("A", new Bitmap(@"C:\08\letters\1\a1.bmp", true)); 
    lookup.Add("A", new Bitmap(@"C:\08\letters\1\a2.bmp", true)); // Error will be here, because key A already exists for one Bitmap value. 
    lookup.Add("a", new Bitmap(@"C:\08\letters\1\aa1.bmp", true)); 
    lookup.Add("B", new Bitmap(@"C:\08\letters\1\b1.bmp", true)); 

现在,抓住图像和值我以下:

var target = lookup.ToList(); 
bitmap b1 = target[j].Value; //grab value 
//if value = cropped bitmap => proceed 
string key = target[j].Key; //grab key 

如何将根据您的解决方案这一过程的变化?

P.s.我听说过“System.Linq.Lookup(Of TKey,TElement)”,但从未使用过。这个“查找”能帮助我解决我的问题还是一个完全不同的工具?谷歌也不太了解它,所以一个例子会受到欢迎

请注意,我只在程序启动时加载字典一次,所以添加速度无关紧要。查询,另一方面是最困扰我的东西。我在我的两本词典中有120个元素,根据这篇文章http://www.dotnetperls.com/dictionary-time - 在List中查找比在字典中慢得多..

无论如何我会做一些措施来测试List解决方案那是在下面建议的 - 与我现在正在使用的Dictionary解决方案进行比较,稍后可能会在今天晚上讲述结果。

回答

2

Lookup。它基本上是一个值列表键的字典,而不是键值。

lookup.Add("a", "123"); // creates 'a' key and adds '123' to it 
lookup.Add("a", "456"); // adds '456' to existing 'a' key 
lookup.Add("b", "000"); // creates 'b' key and adds '000' to it 
+1

你如何声明查找?我试过“查找 lookup = new Lookup ();”并且结果是“类型'System.Linq.Lookup '没有定义的构造函数 ” – Alex 2012-04-01 10:49:25

+0

它应该工作,至少在.Net4上,但是您也可以通过以下方式间接创建它:http ://msdn.microsoft.com/en-us/library/bb460184(v = vs.90).aspx – SimpleVar 2012-04-01 12:02:50

0

不能使用相同的密钥添加项目到dictionary。我认为你正在使用错误的数据结构。我可能需要使用list<>来代替。像这样:

var lookup=new List<KeyValuePair<string,Bitmap>>(); 
lookup.Add(new KeyValuePair<string,Bitmap>("A", new Bitmap(@"C:\08\letters\1\a1.bmp", true))); 
lookup.Add(new KeyValuePair<string,Bitmap>("A", new Bitmap(@"C:\08\letters\1\a2.bmp", true))); 
lookup.Add(new KeyValuePair<string,Bitmap>("a", new Bitmap(@"C:\08\letters\1\aa1.bmp", true))); 
lookup.Add(new KeyValuePair<string,Bitmap>("B", new Bitmap(@"C:\08\letters\1\b1.bmp", true))); 

你可以这样做。如果不这样做ToList()

bitmap b1 = target[j].Value; //grab value 
string key = target[j].Key; //grab key 

编辑

但是,如果你在一个Dictionary做一个ToList()那么你缺少摆在首位有Dictionary点。因为那么你正在访问Dictionary,无论如何list的方式。我也可以在Dictionary上看到ToList()的问题,因为Dictionary中的排序不是像插入它们那样,而是通过散列。这意味着您无法确定索引1是否为索引1.您还必须考虑到Dictionary上的操作add不如List上的add有效。带有词典的上帝的事情是查找速度很快。但是,你没有使用你现有的解决方案。

所以有两种方法我可以看到。上面的一个或确保密钥是唯一的,并通过Dictionary查找得到它。就像这样:

Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>(); 
lookup.Add("A", new Bitmap(@"C:\08\letters\1\a1.bmp", true)); 
lookup.Add("B", new Bitmap(@"C:\08\letters\1\a2.bmp", true)); 
lookup.Add("C", new Bitmap(@"C:\08\letters\1\aa1.bmp", true)); 
lookup.Add("D", new Bitmap(@"C:\08\letters\1\b1.bmp", true)); 

然后你就可以得到Bitmap这样的:

Bitmap bm; 
if(lookup.TryGetValue("A",out bm)) 
{ 
    //Do something 
} 

或者,如果你知道,关键是存在于Dictionary那么你可以这样做:

Bitmap bm; 
bm= lookup["A"]; 
+0

好吧,所以我有几个问题:这个“List方法”比Dictionary更慢/更快?根据这篇文章“http://www.dotnetperls.com/dictionary-time”列表慢一倍,字典只有12!元素..我在一本字典中存储了120个元素,所以有些事情告诉我List不是那里最好的解决方案。 – Alex 2012-04-01 11:07:38

+0

更新了答案。看一看 – Arion 2012-04-01 12:05:12

0

首先,'多个bmp-s'不同于'代表关键' - 或者'有一个关键字'关联(映射)成多个'值' - w这是Yorye正确的建议。
所以,如果你想要更多的值附加到一个单一的关键 - 那么你可以使用像Dictionary<TKey, IList<TValue>> - 其中TKey和TValue是你需要的类型。
但是,这不'解决索引和查询数据。
这假设你的'钥匙'只是'A'在你的情况 - 这是不清楚它是什么。
因此,在这种情况下,您正在使用“字典”来表示不应使用的内容。 Dictionary是一种哈希结构(基本上将其所有条目索引到存储桶等中),这些服务器加速了查询过程,找到了“正确的”值。
正如我在你的案例中看到的'钥匙'是'位图集'这种类型的呈现OCR编辑图像'签名',如果我是正确的?我不是很多在OCR但我猜在这里。
这会使事情变得复杂了一点,你需要创造一种的“复合”键。
的“钥匙”,而不是“价值”(或值列表)将是位图(假设它们可以做成可比较的并且相等或不相等,并且存在如何将多个值与多个值进行比较等问题)。
如果通常情况是这样(但对于更简单的情况比你的),你会创建一个自定义的类,并让该类有一个GetHashCode()等于覆盖(或我EqualityComparer)等,以便它可以在字典中用作关键字。然后你用它作为关键。
再次,在你的情况下,我认为这是一个有点延伸(从某种意义上说,这是不容易实现)。
基本上你需要考虑'查询'数据,而不是存储。什么是你的系统真正的'钥匙'。如果它是一个位图,它总是相同的(或者如果不是你如何比较签名bmps),那么你可以保存一些bmp哈希代码,并将其用作关键字 - 并比较它,而不是bmps。
即你需要考虑这样的事情 - 然后解决方案通常是显而易见的,你需要使用什么。
我不会推荐列表,因为这是一个穷人的选择 - 除非你可能只有一对夫妇,所以很容易通过它手工完成,不知怎的,我不认为你的情况就是这样。
如果您需要通过某些键或键进行“索引”的方式 - 那么通常是字典(或字典以某种方式或部分参与) - 但您可以有许多“字典”或组合。你也可以有'多种类型的键'和值等。
你需要给我们一些数据。
希望这有助于
编辑:最后 - 获得正确的'哈希代码'也不是一件简单的事情要做 - 就像你的自定义结构,comnparing,这是你需要自己设计的东西 - 这样归结到什么是你的关键 - 什么代表“关键”(如哪些属性,值最能描述它,并使其独特,对图像/ bmp做些什么?),散列值的分布等。

相关问题