Рейтинг:
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();
}
Вот как это работает:
- Объявите значения, которые вы хотите найти.
- Получить перечислитель[^] из словаря.
- Объявите массив, в котором будут храниться ключи.
- Перебирайте значения, которые вы хотите найти:
- Если значение текущей пары ключей перечислителя не является текущим значением, которое мы ищем, мы перемещаем перечислитель и повторяем эту проверку. Если MoveNext возвращает false, то элементов больше нет, поэтому можно найти не все значения.
- Как только текущее значение перечислителя становится тем, что мы ищем, мы сохраняем ключ текущей пары KeyValuePair.
- Затем мы снова перемещаем перечислитель, чтобы избежать того, что мы снова получим тот же ключ, если следующий элемент в "значениях" будет таким же.
- Теперь у вас есть
keys
массив со всеми ключами.
Перечислитель позволяет легко просматривать словарь без необходимости отслеживать дополнительный индекс.
Love Allah
спасибо Вам большое это сработало
Thomas Daniels
Всегда пожалуйста!