2010-06-14 4 views
1

.net 2.0의 하드 코딩을 곧 3.5 응용 프로그램으로 만들지 않으려 고합니다.C# 응용 프로그램의 하드 코딩 된 데이터 액세스

나는 하나의 문자열을 1 대 1로 매핑하고자하는 커다란 열거 형을 가지고있다. 열거 된 각 값은 작업을 나타내는 2 개의 값 중 하나에 매핑됩니다. 기존 코드는 큰 switch 문을 사용하여 이것을 수행하지만 이것은 나에게보기 흉한 것처럼 보입니다.

데이터를 저장하고 액세스하는 더 좋은 방법이 있습니까?

resx 파일에 대해 생각해 봤지만 디자이너 파일에 하드 코딩 된 값이 포함되어 있다고 생각하면 약간의 무의미한 것으로 보입니다.

xml 파일을 어셈블리에 포함시키는 것이 좋습니다.

커다란 switch 문은 그렇게 나쁘지 않습니까?

더 좋은 솔루션이 있습니까?

답변

0

switch 문이 열거 형을 문자열에 매핑하는 가장 효율적인 방법 인 이유는 다소 불투명합니다. XML 파일을 포함 시키면 어셈블리 크기가 커지고 필요한 문자열 값을 얻는 데 훨씬 오래 걸립니다.

+0

이상적인 것은 아니지만 아마도 이것이 가장 간단한 해결책 일 것입니다. – haymansfield

1

열거 형 설명 특성을 사용하여 각 열거 형 값에 문자열을 할당 할 수 있습니다. switch 문보다 더 효율적인지는 모르겠지만 enum이 정의 된 코드에서 같은 위치에 문자열 값을 할당하는 이점이 있습니다.

CodeProject에는 here이라는 기사가 있습니다. 좋은 예가 here입니다.

+0

이것들은 모두 문자열을 매핑하는 데 좋은 아이디어이지만 솔루션으로는 할 수없는 두 번째 2 값 속성에 매핑해야합니다. – haymansfield

+0

사용자 정의 속성을 항상 정의 할 수 있습니다. http://msdn.microsoft.com/en-us/library/aa288454%28VS.71%29.aspx를 참조하십시오. 유일한 문제는 리플렉션을 사용하여 값을 가져와 switch 문처럼 효율적이지 않을 수도 있다는 것입니다. – TLiebe

+0

성능 저하로 인해 다른 옵션이없는 경우에만 리플렉션을 사용해야합니다. –

0

this 질문에 대한 답변도 참조하십시오.

IMHO, 큰 switch 문은 항상 코드 냄새가 있으며 유지 관리가 불가능합니다.

+0

이들은 모두 문자열을 매핑하는 데 좋은 아이디어이지만 솔루션으로는 할 수없는 두 번째 2 값 속성에 매핑해야합니다. – haymansfield

+0

다른 사전을 사용하거나'Dictionary '을 사용하십시오. – SWeko

0

이 경우 열거 형을 사용하면 둥근 구멍에 정사각형 못을 끼워 넣으려고합니다. XML은 당신이하려는 일에 과잉이다.

대신 사전을 사용하십시오. 그런 식으로 직접 '키 => 값'관계가 있으며 값은 무엇이든 될 수 있습니다.

1-1 문자열 문자열 관계를 위해 이것을 사용 :

Dictionary<string, string> dictA = new Dictionary<string, string>(); 
dictA.Add("string1", "value1"); 
dictA.Add("string2", "value2"); 
dictA.Add("string3", "value3"); 

가 사전 사용의 모든 값에 액세스하려면이 :

foreach (KeyValuePair<string, string> item in dictA) 
{ 
    Console.WriteLine("Key: {0}; Value: {1};", item.Key, item.Value); 
} 

당신은 1 필요한 경우 2 1-3 또는 1-n 문자열 관계를 사용하십시오 :

Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>(); 
dictB.Add("string1", new List<string>() {"value1A", "value1B"}); 
dictB.Add("string2", new List<string>() {"value2A", "value2B"}); 
dictB.Add("string3", new List<string>() {"value3A", "value3B"}); 
당신이 지그재그 배열 관계의 사용이 필요한 경우

foreach (KeyValuePair<string, List<string>> item in dictB) 
{ 
    Console.WriteLine("Key: {0}; Values: {1}, {2};", item.Key, item.Value[0], item.Value[1]); 
} 

가 :

Dictionary<string, List<string>> dictB = new Dictionary<string, List<string>>(); 
dictB.Add("string1", new List<string>() {"value1A", "value1B, value1C"}); 
dictB.Add("string2", new List<string>() {"value2A", "value2B, value2C, value2D"}); 
dictB.Add("string3", new List<string>() {"value3A", "value3B"}); 

가 사전 사용의 모든 값에 액세스하려면

는 사전의 모든 값이를 사용하여 액세스하려면 이 :

foreach (KeyValuePair<string, List<string>> item in dictB) 
{ 
    string values = ""; 
    int valLen = ((List<string>)item.Value).Count; 
    for (int i = 0; i < valLen; i++) 
    { 
     if (i == (valLen - 1)) 
     { 
      values += item.Value[i] + ""; 
     } 
     else 
     { 
      values += item.Value[i] + ", "; 
     } 
    } 
    Console.WriteLine("Key: {0}; Values: {1};", item.Key, values); 
} 

특정 키의 값을 얻으려면 다음과 같이하십시오.

string match = "string2"; 
if (dictD.ContainsKey(match)) 
{ 
    Console.WriteLine("The value for Key='{0}' is: '{1}'", match, dictD[match]); 
} 

열거 형은 영광스러운 사전입니다. 그렇기 때문에 다른 많은 언어 (특히 동적 유형 언어)에서는 해당 언어를 볼 수 없습니다.

관련 문제