Love Allah Ответов: 2

Как получить ключ словаря по значению


У меня есть словарь со строковым типом содержит :
ключевая ценность
1 ---- 3
2 ---- 5
3 ---- 4
4 ---- 3
5 ---- 10
6 ---- 3
7 ---- 5
8 ---- 9
9 ---- 3
10 ---- 3

программа выбирает значения по некоторым критериям скажем программа выбирает значения (3,3,3) и мне нужно сопоставить эти значения с ее ключами результаты должны быть:
(1,4,6) соответственно. как я могу это сделать!

Что я уже пробовал:

string myKey = dictinonary.FirstOrDefault(x => x.Value == values[i]).Key;

2 Ответов

Рейтинг:
2

Maciej Los

Ответ №1 by ProgramFOX[^] очень хорошо. В дополнение к этому я хотел бы поделиться еще одним решением, которое использует Linq.

//create dictionary object and full fill it
Dictionary<int, int> dict = new Dictionary<int, int>();
dict.Add(1, 3);
dict.Add(2, 5);
dict.Add(3, 4);
dict.Add(4, 3);
dict.Add(5, 10);
dict.Add(6, 3);
dict.Add(7, 5);
dict.Add(8, 9);
dict.Add(9, 3);
dict.Add(10, 3);

//create a list of values to find in dictionary
List<int> valuesToFind = new List<int>{3, 3, 3};

//get respective keys
var respectiveKeys = dict
	.Where(kvp=> valuesToFind.Any(y=>y==kvp.Value)) //compare searched values with values in dictionary object
	.Select(kvp=> new
	{
		k = kvp.Key,
		//v = kvp.Value
	}); //get only respective (corresponding) keys
	//.Take(3); //use it, if you want to get only 3 result

//display 
foreach (var key in respectiveKeys)
{
	Console.WriteLine(key);
}


Thomas Daniels

К сожалению, это не гарантирует правильного порядка ключей: попробуйте {9, 4} в качестве значений найти, и ключи будут {3, 8}, а не {8, 3}.

Maciej Los

Я не вижу такого требования...

Thomas Daniels

Я мог бы представить себе это требование, но ОП утверждает в своем примере, что ключи "должны быть (1,4,6) соответственно", и выбор слова "соответственно" заставил меня предположить, что порядок должен соблюдаться во всех случаях.

В любом случае, это определенно аккуратное решение, если порядок не имеет значения.

Maciej Los

Как по мне "соответственно" означает "получить соответствующие значения".

Thomas Daniels

А-а, понятно. Определение соответственно - "отдельно или индивидуально и в уже упомянутом порядке", что заставило меня думать, что порядок был важен; конечно, я не могу сказать, было ли намерение ОП моей или вашей интерпретацией. Вполне возможно, я просто придираюсь к мелочам здесь :)

Maciej Los

ОК. Английский - не мой родной язык. Так что, вполне возможно, я неправильно понял намерение ОП. Спасибо за ваше время (и надеюсь, что вы проголосуете).
Овации,
Мацей

Thomas Daniels

Да, я проголосовал за 4.

Maciej Los

Еще раз спасибо :D

Рейтинг:
14

Thomas Daniels

Вот способ сделать это:

int[] values = new int[] { 3, 3, 3 };
IEnumerator<KeyValuePair<int, int>> enumerator = dictionary.GetEnumerator();
int[] keys = new int[values.Length];
for (int i = 0; i < keys.Length; i++)
{
    while (enumerator.Current.Value != values[i])
    {
        if (!enumerator.MoveNext())
        {
            // not all values could be found
        }
    }
    keys[i] = enumerator.Current.Key;
    enumerator.MoveNext();
}
Вот как это работает:
  1. Объявите значения, которые вы хотите найти.
  2. Получить перечислитель[^] из словаря.
  3. Объявите массив, в котором будут храниться ключи.
  4. Перебирайте значения, которые вы хотите найти:
    1. Если значение текущей пары ключей перечислителя не является текущим значением, которое мы ищем, мы перемещаем перечислитель и повторяем эту проверку. Если MoveNext возвращает false, то элементов больше нет, поэтому можно найти не все значения.
    2. Как только текущее значение перечислителя становится тем, что мы ищем, мы сохраняем ключ текущей пары KeyValuePair.
    3. Затем мы снова перемещаем перечислитель, чтобы избежать того, что мы снова получим тот же ключ, если следующий элемент в "значениях" будет таким же.

  5. Теперь у вас есть keys массив со всеми ключами.

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


Love Allah

спасибо Вам большое это сработало

Thomas Daniels

Всегда пожалуйста!

Maciej Los

5ed!