2012-03-31 3 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 
    } 

문제는이 코드 내 주요 파일 공간의 거의 절반을 차지한다는 것입니다, 그래서 나는 그것에서 사전을로드하는 별도의 파일을 만드는 방법에 대해 생각했다. 이 같은

using getDictData 

및 사용 : 내가 추가

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

주요 파일 :

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

그래서 별도의 클래스를 만들 수 (CS) 파일을 시도

아무 것도 작동하지 않는 것 같습니다. 어떻게 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; 
    } 

결과에 상관없이 내가 코드를 변경하는 방법, 항상 null입니다 : 뭔가가 사전에로드 된 경우 확인하려면이 코드를 사용하고 있습니다.

내가 메인 파일에서 사전 초기화를 삭제하면 나는

'이름'조회 '현재 컨텍스트에 존재하지 않는 "지고있어 :

"소스. 값은 매개 변수 이름 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();를 호출하는 대신 모든 사전을 한 가지 방법으로로드 할 수 있습니까? ? 글쎄, 그렇게 대단한 것은 아니지만 어쨌든 .. 도움에 다시 감사합니다 – 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();를 호출하고 당신은

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

불행히도 오류가 발생했습니다 ..하지만 @Alex 귀하의 솔루션에 감사드립니다! 나는 지금 다른 방법을 고수 할 것입니다. – Alex