C#에서 상수 사전 만들기



.net collections (6)

string s를 int 매핑하는 상수 를 생성하는 가장 효율적인 방법은 무엇입니까?

내가 const 사전을 사용하여 시도했지만 그게 잘되지 않았다.

나는 적절한 의미론을 가진 불변의 래퍼 를 구현할 수 있지만, 여전히 완전히 옳은 것처럼 보이지는 않는다.

요청한 사람들을 위해 생성 된 클래스에서 IDataErrorInfo 를 구현하고 있으며 columnName을 내 디스크립터 배열로 룩업 할 방법을 찾고 있습니다.

나는 스위치가 문자열을 받아들이는 것을 인식하지 못했다. (그래서 테스트 할 때 오타가된다!) 그래서 내가 사용할 것이다. 감사!


Answer #1

왜 네임 스페이스 나 클래스를 사용하여 값을 중첩하지 않습니까? 불완전 할 수도 있지만 매우 깨끗합니다.

public static class ParentClass
{
    // here is the "dictionary" class
    public static class FooDictionary
    {
        public const string Key1 = "somevalue";
        public const string Foobar = "fubar";
    }
}

이제 .ParentClass.FooDictionary.Key1 등에 액세스 할 수 있습니다.


Answer #2

사전에는 표준 불변 인터페이스가없는 것처럼 보이므로 래퍼를 만드는 것이 유감스럽게도 유일한 합리적인 옵션처럼 보입니다.

편집 : Marc Gravell은 제가 놓친 ILookup을 발견했습니다. --ToLookup ()을 사용하여 Dictionary를 변형해야하지만, 적어도 새로운 래퍼를 만드는 것을 피할 수 있습니다.

특정 시나리오에 제약이 필요한 상황이라면보다 비즈니스 로직 중심의 인터페이스를 사용하는 것이 더 나을 것입니다.

interface IActiveUserCountProvider
{
    int GetMaxForServer(string serverName);
}

Answer #3

왜 안돼 :

public class MyClass
{
    private Dictionary<string, int> _myCollection = new Dictionary<string, int>() { { "A", 1 }, { "B", 2 }, { "C", 3 } };

    public IEnumerable<KeyValuePair<string,int>> MyCollection
    {
        get { return _myCollection.AsEnumerable<KeyValuePair<string, int>>(); }
    }
}

Answer #4

이것은 "CONST 사전"에 접근 할 수있는 가장 가까운 것입니다 :

public static int GetValueByName(string name)
{
    switch (name)
    {
        case "bob": return 1;
        case "billy": return 2;
        default: return -1;
    }
}

컴파일러는 코드를 가능한 한 깨끗하게 만들 정도로 똑똑 할 것입니다.


Answer #5

진정으로 컴파일 타임에 생성 된 상수 사전을 C #으로 작성하는 것은 직접적인 작업이 아닙니다. 사실, 여기에있는 답변 중 어느 것도 실제로 그것을 달성하지 못합니다.

그러나 반드시 좋은 것은 아니지만 요구 사항을 충족시키는 하나의 솔루션이 있습니다. C # 스펙에 따르면 스위치 케이스 테이블은 상수 해시 점프 테이블로 컴파일된다는 것을 기억하십시오. 즉, 그들은 일련의 if-else 문이 아닌 상수 사전입니다. 다음과 같은 switch-case 문을 고려하십시오.

switch (myString)
{
   case "cat": return 0;
   case "dog": return 1;
   case "elephant": return 3;
}

이것은 정확히 당신이 원하는 것입니다. 그리고 예, 압니다, 나는 추합니다.


Answer #6
enum Constants
{
    Abc = 1,
    Def = 2,
    Ghi = 3
}

...

int i = (int)Enum.Parse(typeof(Constants), "Def");




constants