Есть ли способ проверить, содержит ли KeyValuePair<string, int> определенный ключ в словаре в одной строке?

В моем коде есть словарь, который сначала был просто <string, int>. Однако мне нужен был способ сделать две вещи с одной и той же строкой отдельными элементами в словаре, поэтому я сделал ключ int, а значение — KeyValuePair<string, int>.

Dictionary<int, KeyValuePair<string, int>>()

Проблема в том, что мне нужно проверить, существует ли определенная строка в словаре, желательно без использования цикла for/foreach. Используя Dictionary.ContainsValue, я мог бы проверить наличие KeyValuePair, но целое число в KeyValuePair не указано, и оно должно было бы быть, если бы я использовал containsValue.

Есть ли способ проверить, содержит ли словарь KeyValuePair с определенным ключом в одной строке?

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

Заранее спасибо!

Похоже, ключ в твоем словаре стоит не на том месте...

Charlieface 07.07.2024 22:21

Нет, вот в чем дело; Раньше ключ был строкой, но мне нужно иметь возможность иметь одну и ту же строку несколько раз, поэтому я сделал ключ целым числом, чтобы сделать его уникальным.

polelord 07.07.2024 23:22

Может быть, вместо этого вам нужен Lookup?

Charlieface 08.07.2024 01:17

ИМХО Dictionary<string, HashSet<int>> или типа того. Вы все еще хотите найти строковый ключ, верно?

Jeremy Lakeman 08.07.2024 04:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

+1 этот словарь больше не выглядит как адекватная структура данных для ваших нужд. Вы перешли от потребности в уникальной строке (по сути, индексированном значении) к структуре, в которой строку можно дублировать. С таким же успехом вы можете использовать List<KeyValuePair<string,int>> сейчас.

Однако да, вы все равно можете проверить значения словаря:

// Does a string exist: 
var exists = myDictionary.Values.Any(x => x.Key == myString);

// Values with string: 
var keyValues = myDictionary.Values.Where(x => x.Key == myString);

Если у вас все еще нет кода, который индексирует словарь по уникальному идентификатору, нет смысла продолжать использовать словарь.

Кажется, я не могу использовать «Где» или «Любой» и не могу ничего найти по этому поводу в Google. Вместо этого я, вероятно, воспользуюсь списком. Спасибо!

polelord 08.07.2024 00:20

Они являются расширениями в System.Linq и должны нормально работать с набором Dictionary.Values ​​(но не с самим словарем). Но да, List, возможно, более подходит.

Steve Py 08.07.2024 00:54

Похоже, вам нужен словарь словарей; что (как я обнаружил) довольно часто встречается в командных и многопользовательских сценариях; например

// ... playerDic = new Dictionary<int, Dictionary<string, int>>();
// ... propertyDic = new Dictionary<string, int>();

int player = 1;
string property = "Lives";

propertyDic[ property ] = 9;
playerDic[ player ] = propertyDic;

// ...
var playerLives = playerDic.Contains( player ) ? 
   playerDic[ player ].Contains( property ) ?
   playerDic[ player ][ property ] : 0;  // or some other default.

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

Другие вопросы по теме