2012-03-31 51 views
0

我有字典。首先我初始化它们。从C文件加载字典#

public Dictionary<string, Bitmap> lookup; 
    public Dictionary<string, Bitmap> lookup2; 
    public Dictionary<string, Bitmap> lookup3; 

然后在button_click事件上加载字典。

private void button2_Click_1(object sender, EventArgs e) 
    { 
    lookup = new Dictionary<string, Bitmap>(); 
    Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); lookup.Add("1", l1); 
    // add hundreds more 
    } 

的问题是,这种代码占用了近一半的我的主要文件的空间,所以我在想创建一个单独的文件,从它加载字典。

所以我试图创建一个单独的类(CS)文件:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 

namespace getDictData 
{ 
    class mydict 
    { 
     public static void loadDict() 
     { 
      Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>(); 
      Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); lookup.Add("1", l1); 
     } 
    } 
} 

在主文件我补充一下:

using getDictData 

,并使用它像这样:

private void button2_Click_1(object sender, EventArgs e) 
{ 
mydict.loadDict(); 
} 

似乎没有任何工作..所以你如何从不同的文件加载方法与C#?

编辑:我使用此代码来检查,如果事情被加载到词典:

private void button8_Click(object sender, EventArgs e) 
    { 
     var targer = lookup.ToList(); // error is thrown here 
     string s = targer[0].Key; 
     textBox6.Text = "" + s; 
    } 

结果总是空,不管我怎么更改代码。

“值不能为空参数名:源”

,如果我删除主文件的字典初始化我越来越

“这个名字‘查找’不存在当前上下文存在”

+1

'没有什么似乎在工作什么是什么? – Reniuz 2012-03-31 10:02:30

+1

看起来正确。它是否编译? “你的一半文件空间”是什么意思?什么使得加载代码如此之大?如果有很多位图加载,也许你应该加载目录中的所有图像?另外:C#代码通常具有以大写字母开头的名称空间,类名称和方法名称。 – 2012-03-31 10:02:32

+0

您正在使用单独的名称空间来执行处理? – 2012-03-31 10:04:43

回答

2

您面临的麻烦是非常微不足道的。事实上,你可以用不同的文件,类等编写函数,这就是如何完成的。如果你尝试这个,它肯定会工作。

public Dictionary<string, Bitmap> lookup; 
public Dictionary<string, Bitmap> lookup2; 
public Dictionary<string, Bitmap> lookup3; 

private void button2_Click_1(object sender, EventArgs e) 
{ 
    lookup = mydict.loadDict(); //now that you have loaded it. 
} 

你的类应该是:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 

namespace getDictData 
{ 
    class mydict 
    { 
     public static Dictionary<string, Bitmap> loadDict() 
     { 
      Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>(); 
      Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); lookup.Add("1", l1); 
      return lookup; 
     } 
    } 
} 

而现在,

private void button8_Click(object sender, EventArgs e) 
{ 
    var targer = lookup.ToList(); //hopefully lookup is not null anymore  

    if (lookup.Count == 0) //or whatever way you want to validate depending upon the indexing u use 
    { 
     MessageBox.Show("No valid items"); //or something similar that you dont get index out of bound exception. 
     return; 
    } 

    string s = targer[0].Key; 
    textBox6.Text = "" + s; 
} 

编辑:我想有只被加载了几个字典。你可以这样做,而不是在评论中回答你的问题,但不是很优雅。

1)返回从字典中加载类的词典列表:

你的字典加载类:

class mydict 
    { 
     public static List<Dictionary<string, Bitmap>> loadAllDicts() 
     { 
      List<Dictionary<string, Bitmap>> lookups = new List<Dictionary<string, Bitmap>>(); 

      Dictionary<string, Bitmap> lookup1 = new Dictionary<string, Bitmap>(); 
      Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); 
      lookup1.Add("1", l1); 
      lookups.Add(lookup1); 

      Dictionary<string, Bitmap> lookup2 = new Dictionary<string, Bitmap>(); 
      Bitmap l2 = new Bitmap(@"C:\1\1.bmp", true); 
      lookup2.Add("1", l2); 
      lookups.Add(lookup2); 

      //etc 

      return lookups; 
     } 
    } 

2),然后

private void button2_Click_1(object sender, EventArgs e) 
    { 
     List<Dictionary<string, Bitmap>> lookups = mydict.loadAllDicts(); 

     lookup = lookups[0]; 
     lookup2 = lookups[1]; 
     lookup3 = lookups[2]; 
    } 
+0

太棒了!它确实有效,但方式与我预期的稍有不同。是否可以使用一种方法加载所有字典,而不是为每个字典创建“loaddict1(),loadDict2(),...”,并调用“lookup1 = mydict.loadDict1(); lookup2 = mydict.loadDict2();” ?好吧,不是这么多,但无论如何..再次感谢您的帮助 – Alex 2012-03-31 10:40:03

+0

@Alex你有几百个这样的字典?我猜只是4或5?在这种情况下,采用相同的方法会更直接,更易读。 – nawfal 2012-03-31 10:53:35

+0

关于“可读性”问题,你肯定是正确的。我有大约9个字典 - 有75个密钥(所以这是75行代码),大约40,甚至10 ..我想让他们分开是件好事毕竟。 – Alex 2012-03-31 11:08:18

0

的问题是,Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>();定义在你的静态方法loadDict()并没有参考外部。你会如何得到这些数据?你可以添加一个属性到你的mydict类。现在

class mydict 
{ 
    public static Dictionary<string, Bitmap> MyLookup { get; private set; } 
    public static void loadDict() 
    { 
        MyLookup.Clear(); 
     Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); 
     MyLookup.Add("1", l1); 
    } 
} 

,叫mydict.loadDict();,然后你可以通过

​​

访问您的位图或使用函数返回值。

public static Dictionary<string, Bitmap> loadDict() 
     { 
        var dict = new Dictionary<string, Bitmap>(); 
      Bitmap l1 = new Bitmap(@"C:\1\1.bmp", true); 
      dict .Add("1", l1); 
        return dict; 
     } 
+0

不幸的是我得到一个错误..但@亚历克斯感谢您的解决方案!我现在要坚持不同的方法。 – Alex 2012-03-31 10:42:59