用C#在启动时加载字典

本文关键字:加载 字典 启动 | 更新日期: 2023-09-27 18:27:50

我有两个字典(Dict1中有10个条目,Dict2中有30个条目)。现在我用这个代码来加载它们:

private void button1_Click(object sender, EventArgs e)
{
    Bitmap l0 = new Bitmap(@"C:'0money'0.bmp", true);
    // +100 more
    Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>();
    lookup.Add("0", l0);
    // +100 more
}

我计划再创建3本字典,所以总条目数将达到100+!

如何在程序启动时加载所有这些字典,而不是在button_click事件中(重复)加载

编辑:正如你们中的许多人所建议的那样,我尝试将代码放在Form_Load事件上,结果我得到了"名称'lookup'在当前上下文中不存在"错误。我无法执行button_click事件的代码。

用C#在启动时加载字典

您可以将其保留在类实例上,也可以将其保持为静态,这取决于它的使用方式。

private static Dictionary<string, Bitmap> _lookup = new Dictionary<string, Bitmap>();
static MyClass()
{
    lookup.Add("0", l0);
    // +100 more
}

如果该类的实例只创建过一次,则将其设为非静态实例。在这里,我假设它所处的class被称为MyClass变化(视情况而定)。

您可能希望将其存储在应用程序上下文中(如果它将被整个应用程序重用,并且它不是特定于用户的)。

最好的方法是在ApplicationStart上完成,您可以在Global.asax.中处理它

希望能有所帮助。

更新我不认为实际存储整个位图对象是个好主意!你可能需要重新考虑一下你的应用程序的架构以及你想要实现的目标。

网络农场场景在网络农场场景中,这将是一个不同的场景。您的每个应用程序都将有一个不同的应用程序变量实例。

然后,我很想建议拥有一个会话状态服务器并将其保持在会话中(然后将在所有应用程序中共享)——通过,您可能会遇到标准会话状态服务器的一些问题

您还可以将资源(由应用程序共享)联合复制到网络路径上,或以二进制形式存储在数据库中,然后在每个服务器节点上加载它们-应用程序启动-您仍然可以在每个服务器结点中拥有这些资源的实例

如果使用WinForms,请将代码放入表单加载事件中。

private void Form1_Load(object sender, System.EventArgs e) {
    Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>() {
        {"0", new Bitmap(@"C:'0money'0.bmp", true)},
        {"1", new Bitmap(@"C:'0money'1.bmp", true)}
    }
}

更新

如果您想在button_click事件中使用Dictionary,则必须将其保留在类实例中,或者将其定义为静态的,如Davy8所述。

public class MyFancyForm {
    private Dictionary<string, Bitmap> lookup;
    private void Form1_Load(object sender, System.EventArgs e) {
        // init dictionary
        lookup = new Dictionary<string, Bitmap>() {
            {"0", new Bitmap(@"C:'0money'0.bmp", true)},
            {"1", new Bitmap(@"C:'0money'1.bmp", true)}
        }
    }
    private void button1_Click(object sender, EventArgs e) {
        // do something with lookup
    }
}

假设您的文件列表是从0.bmp100.bmp命名的,您可以执行以下操作:

string startupFolder = @"C:'0money'";
Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>();
for(int i = 0; i <= 100; i++)
{
    Bitmap l = new Bitmap(startupFolder + i + ".bmp", true); 
    lookup.Add(i.ToString(), l);
} 

您可能希望将这些代码放在form_load中,以便在启动时添加它们。

您可以Cache在用户之间共享它们。请记住,如果要在服务器场上部署,则必须使用"组件"来管理整个web场的缓存。

我不会使用应用程序上下文来处理以下问题:

应用程序状态不会在为同一应用程序提供服务的多个服务器之间共享,如在Web场中,也不会在为相同服务器上的相同应用程序提供的多个工作进程之间共享,例如在Web花园中。因此,您的应用程序不能依赖于包含不同服务器或进程中应用程序状态的相同数据的应用程序状态。如果您的应用程序将在多处理器或多服务器环境中运行,请考虑使用更具可扩展性的选项(如数据库)来处理必须在整个应用程序中保持保真度的数据

http://msdn.microsoft.com/en-us/library/ms178594.aspx