2013-02-12 3 views
2

TKey이 클래스 인 IDictionary<TKey, TValue>이 있습니다. 인덱서를 사용하는 기능을 대신 String 값을 추가 할 수 있습니까? 사전 TKey Indexer 문자열 사용

public class MyClass { 
    public string Name { get; set; } 
} 

.... 

//dict is a IDictionary<MyClass, object> 
dict.Add(new MyClass { Name = "Foo" }); 

은 현재 내가 Name하여 값에 액세스 할 Linq를 사용하고 있지만이 같은 선호 :

//This call returns the variable I added above 
object value = dict["Foo"]; 

이 가능를?

+0

자신의 클래스에'IDictionary <,>'을 구현할 수 있습니다 ..? –

+0

@ 시몬 나는 내 자신의 IDictionary를 만들지 않으려 고 노력했다. –

답변

0

이이 문제에 대한 좋은 방법이 될 수도, 평등을 정의 할 Name를 사용하는 경우 일반적으로 감각 MyClass 만들고, 단지이 특정 사전에 :

public class MyClass 
{ 
    public string Name { get; set; } 
    public override int GetHashCode() 
    { 
     return Name.GetHashCode(); 
    } 
    public override bool Equals(object other) 
    { 
     return this.Name == ((MyClass)other).Name; 
    } 
} 

그런 다음 사전입니다 단순히 MyClass 개체로 인덱싱됩니다. 당신이 대신 MyClass 인스턴스의 명시 적 string이있는 경우는 다음과 같이 사전의 값을 얻을 수 있습니다 :

dict[new MyClass { Name = "Foo" }] 

또한 추가 할 수있는 :

public static implicit operator MyClass(string s) 
{ 
    return new MyClass { Name = s }; 
} 

그리고 지수와 같은 :

dict["Foo"] 

이 특정 사전에 사용하기위한 것이 아니라 MyClass이 일반적으로 의미가있는 경우에만이 작업을 수행하십시오. 이 특정 사전의 경우 다른 해결책을 시도하십시오.

+0

감사합니다 Tim. 암묵적인 연산자를 사용하는 것에 대해 생각하지 않았습니다. 최종 결과는 정확히 필요한 것입니다. –

+1

@SimonHartcher 당신이 사전에 저장된 것을 액세스 할 필요가있을 때마다 (쓸모없는) 'MyClass'의 창안을 만드는 것이 좋은 접근 방법이라고 생각합니까? – horgh

+0

@ ConstantinVasilcov 제 경우에는 그렇게합니다. 이 특정 문제에 대해서만 IDictionary를 만들 필요는 없으며 코드 영향은 최소화됩니다. 내가 뭔가를 놓치지 않는 한, 큰 문제는 보이지 않는다. –

3

클래스에 따라 고유 한 사전 클래스를 만들 수 있습니다.

public class MyClass 
{ 
    public string Name { get; set; } 

    // You may want to implement equality members on your class so that 
    // the dictionary treats the Name value as the key correctly. 
} 

public class MyClassDictionary<TValue> : Dictionary<MyClass, TValue> 
{ 
    public TValue this[string val] 
    { 
     get 
     { 
      return base[Keys.First(x => x.Name == val)]; 
     } 
    } 
} 

원하는대로 사용할 수 있습니다.

MyClassDictionary<string> instance = new MyClassDictionary<string>(); 

instance.Add(new MyClass() { Name = "testkey" }, "test value"); 

Debug.WriteLine(instance["testkey"]); 
+0

나는 그의 솔루션으로 MyClass를 바꾸기 만하면 팀의 답을 찾았다. 그러나이 솔루션은 작동하지 않습니다 :) –

+0

아무런 걱정없이 암시 적 연산자도 간단한 대답으로 나를 빠져 나갔습니다.> –

관련 문제