загрузка словарей из файла с C # - PullRequest
0 голосов
/ 31 марта 2012

У меня есть словари.Сначала я их инициализирую.

    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;
    }

результат всегда нулевой, независимо от того, как я изменяю код.

"Значение не может быть нулевым. Имя параметра: источник"

, и если я удаляю инициализацию словаря из основного файла, я получаю

"Имя 'lookup' не существуетв текущем контексте "

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Проблема, с которой вы сталкиваетесь, является чем-то очень тривиальным.На самом деле вы можете писать функции в разных файлах, классах и т. Д., И вот как это должно быть сделано.Если вы попробуете это, это определенно сработает.

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 голосов
/ 31 марта 2012

Проблема в том, что 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();, и затем вы можете получить доступ к своим растровым изображениям через

mydict.MyLookup

Или использовать функцию с возвращаемым значением,

 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;
        }
...