2012-03-31 38 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 getDictData 

とこのようにそれを使用します:

private void button2_Click_1(object sender, EventArgs e) 
{ 
mydict.loadDict(); 
} 
私は追加のメインファイルに

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

何も動作していないようです。だからどのようにC#で別のファイルからメソッドをロードしますか?

EDIT:

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

結果は関係なく、私は、コードをどのように変化するかを、常にnullではありません:私は何かが辞書にロードされたかどうかを確認するために、このコードを使用しています。

「Valueはパラメータ名nullにすることはできません:ソース」

と私はメインファイルから辞書の初期設定を削除した場合、私は「名前 『のルックアップ』は現在のコンテキスト内に存在しない」

を取得しています

+1

「何も動作していないようです」何もありません。 – Reniuz

+1

正しく表示されます。それはコンパイルされますか? 「ファイルスペースの半分」という意味はどういう意味ですか?ローディングコードを大きくする理由ロードするビットマップがたくさんある場合は、ディレクトリからすべてのイメージをロードするだけでしょうか?また、C#コードには、通常、名前空間、クラス名、およびメソッド名が大文字で始まります。 –

+0

別の名前空間を使用して処理していますか? –

答えて

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();を呼び出すのではなく、1つの方法ですべての辞書を読み込むことは可能ですか? ?まあ、それほど大したものではありませんが、とにかく助けてくれてありがとう – Alex

+0

@Alexあなたは何百もの辞書を持っていますか?私はちょうど4または5を推測する?その場合、同じアプローチをとることはより直接的であり、読みやすくなります。 – nawfal

+0

あなたは「可読性」の問題について最も確かに正しいです。私は約9つの辞書を持っています - あるものは75鍵(コードの75行)、約40、または10もあります。結局。 – Alex

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はあなたの解決に感謝します!私は今、別の方法に固執するつもりです。 – Alex

関連する問題