2016-02-18 2 views
0

Этот вопрос может показаться дублирующим и/или слишком скучным, но я хочу сделать это, используя этот метод.Получить ключ по значению в словаре в C#

Когда пользователь вводит строку в текстовое поле, я хочу получить этот строковый ключ. Поэтому для этого я создал словарь, который имеет n (n < = 15000) уникальных значений. Я хочу получить ключ от этого словаря по значению. Ниже метод хорошо работает:

Dictionary<int, string> artikullar = new Dictionary<int, string>(); 
int key = (from elem in artikullar where elem.Value == txt_artikul.Text select elem).First().Key; 

До этого я пытался использовать метод First(), чтобы получить ключ:

int key = artikullar.AsParallel().First(new Func<KeyValuePair<int, string>, bool>(val => val == txt_artikul.Text)).Key; 

Но он бросает эту ошибку:

Operator '==' cannot be applied to operands of type 'KeyValuePair' and 'string'

Я раньше не использовал этот метод.

Любые полезные комментарии или ответы будут оценены.

+1

Почему вы держите 'Словарь ', shoulden't это будет 'Словарь ', если вы выполняете поиск по строке? Кроме того, если у вас одинаковое значение для нескольких клавиш, ваша функция может возвращать разные «клавиши» каждый раз, когда вы запускаете функцию, это приемлемо? –

+0

@ScottChamberlain благодаря быстрой реакции. Ну, значения должны храниться как тип строки и ключей как тип int. Итак, этот синтаксис неверен? Я написал, что ** словарь имеет n (n <= 15000) уникальные значения **. –

ответ

4

Ehsan Sajjad является правильным. Но я хотел бы добавить еще один момент:

Вы сказали, что строки в вашем Dictionary уникальны. Я не знаю, когда вы создали Dictionary, и если данные довольно статичны или динамически меняются все время.

Если это довольно статичным и строки являются уникальными, вы можете рассмотреть, чтобы создать перевернутую Dictionary так:

Dictionary<string, int> reversedDict = artikullar.ToDictionary(
    kvp => kvp.Value, 
    kvp => kvp.Key); 

, а затем использовать это для поиска:

int key = reversedDict[txt_artikul.Text]; 

Это может быть быстрее, чем запрос исходного словаря.

+1

ну, я пропустил уникальную часть струн, хорошее предложение –

+0

Спасибо большое :) –

3

Вы должны изменить:

val => val == txt_artikul.Text 

к:

val = > val.Value == txt_artikul.Text 

у вас есть экземпляр KeyValuePair, вы должны указать Value в лямбда-выражения для сравнения.

+0

Хотя это и решает конкретную проблему, ОП задал вопрос о выборе дизайна, очень плохой. Он не получит ни одного из преимуществ слова «O (1)» словаря, и его поиск может быть очень медленным. –

+0

Возможно, вы правы, но вопрос касается проблемы, с которой он сталкивается с выражением лямбды. –

+0

Иногда [когда кто-то спрашивает вас, должны ли они использовать старый ботинок или стеклянную бутылку, чтобы забить хвост, вам нужно сказать им, чтобы они прекратили то, что они делать и ходить покупать молот] (http://weblogs.asp.net/alex_papadimoulis/408925). –

Смежные вопросы