값으로 사전 키 가져오기

C#에서 값별로 Dictionary 키를 얻으려면 어떻게 하나요?

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

다음과 같은 것을 원합니다:

getByValueKey(string value);

getByValueKey("one")는 `"1"'을 반환해야 합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇인가요? 해시 테이블, 정렬 목록은 어떨까요?

질문에 대한 의견 (5)
해결책

값이 반드시 고유할 필요는 없으므로 조회를 수행해야 합니다. 다음과 같은 작업을 수행할 수 있습니다:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

값이 고유하고 읽기보다 삽입 빈도가 적은 경우 값이 키이고 키가 값인 역 사전을 만듭니다.

해설 (13)

그렇게 할 수 있습니다:

  1. 딕셔너리에 있는 모든 KeyValuePair, TKey, TValue를 반복합니다(딕셔너리에 항목이 많은 경우 성능이 크게 저하될 수 있음).
  2. 값 대 키 매핑과 키 대 값 매핑에 각각 하나씩 두 개의 사전을 사용합니다(메모리 공간을 두 배나 많이 차지함).

성능이 중요하지 않은 경우 방법 1을 사용하고, 메모리가 중요하지 않은 경우 방법 2를 사용합니다.

또한 모든 키는 고유해야 하지만 값은 반드시 고유할 필요는 없습니다. 지정된 값을 가진 키가 두 개 이상 있을 수 있습니다.

키-값 관계를 바꿀 수 없는 이유가 있나요?

해설 (2)

난 롬폭 상황을 확장하십시오 람다 (λ) 는 linq 바인딩하면 사용할 수 없고 직접 했다. 이 사고로 인해 있는 단순한 기능:

"'c # 공용 정적 T, T, W&gt KeyByValue&lt, (이 Dictionary&lt, T, W&gt. 딕트, W val) { T 키 = 기본. 포리치 (KeyValuePair&lt, T, W&gt. 페어당 딕트 에서) { if (EqualityComparer&lt W&gt 이데포t. 퀄스 (파르지팔루, val);;) { 키 = 페어당. 키. 브레이크. } } 주요 반품하십시오. } "'

Call it like 다음과 같습니다.

public static void Main()
{
    Dictionary dict = new Dictionary()
    {
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
    };

    string key = KeyByValue(dict, "two");         
    Console.WriteLine("Key: " + key);
}

Net 2.0 및 기타 제한된 환경 작동합니다.

해설 (1)

내가 만든 이중 조회 클래스:


/// 
/// dictionary with double key lookup
/// 
/// primary key
해설 (0)

아마 이 같은 일이.

foreach (var keyvaluepair in dict)
{
    if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject))
    {
        //dict.Remove(keyvaluepair.Key);
        break;
    }
}
해설 (0)
types.Values.ToList().IndexOf("one");

해당 객체의 목록을 발 주스토리스트 () 는 사전 값을 붙여넣습니다. IndexOf (&quot one";) 검색을 통해 새로운 목록을 찾는 one&quot "; 및 되돌려줍니다 되는 주요 / 가치 있는 인덱스화할 일치시킵니다 색인입니다 페어당 사전이므로

이 방법은 사전 키 값을 색인입니다 되돌려줍니다 높여줍니까 아랑곳하지 않고, 단지 당신이 찾고 있다.

염두에 둘 이상의 &quot one&quot, 있을 수 있습니다. 자신의 가치를 사전이므로 그 때문에, key&quot &quot 얻을 수 없다. 메서드입니다.

해설 (0)

아래 코드를 포함할 경우 고유 값 데이터 때만

public string getKey(string Value)
{
    if (dictionary.ContainsValue(Value))
    {
        var ListValueData=new List();
        var ListKeyData = new List();

        var Values = dictionary.Values;
        var Keys = dictionary.Keys;

        foreach (var item in Values)
        {
            ListValueData.Add(item);
        }

        var ValueIndex = ListValueData.IndexOf(Value);
        foreach (var item in Keys)
        {
            ListKeyData.Add(item);
        }

        return  ListKeyData[ValueIndex];

    }
    return string.Empty;
}
해설 (2)

아주 간단한 방법이 있습니다. 저에게는 완벽하게 작동했습니다.

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
해설 (3)