В моем коде есть словарь, который сначала был просто <string, int>. Однако мне нужен был способ сделать две вещи с одной и той же строкой отдельными элементами в словаре, поэтому я сделал ключ int, а значение — KeyValuePair<string, int>.
Dictionary<int, KeyValuePair<string, int>>()
Проблема в том, что мне нужно проверить, существует ли определенная строка в словаре, желательно без использования цикла for/foreach. Используя Dictionary.ContainsValue, я мог бы проверить наличие KeyValuePair, но целое число в KeyValuePair не указано, и оно должно было бы быть, если бы я использовал containsValue.
Есть ли способ проверить, содержит ли словарь KeyValuePair с определенным ключом в одной строке?
Если у кого-нибудь есть другие решения проблемы, это тоже будет здорово.
Заранее спасибо!
Нет, вот в чем дело; Раньше ключ был строкой, но мне нужно иметь возможность иметь одну и ту же строку несколько раз, поэтому я сделал ключ целым числом, чтобы сделать его уникальным.
Может быть, вместо этого вам нужен Lookup
?
ИМХО Dictionary<string, HashSet<int>>
или типа того. Вы все еще хотите найти строковый ключ, верно?
+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. Вместо этого я, вероятно, воспользуюсь списком. Спасибо!
Они являются расширениями в System.Linq и должны нормально работать с набором Dictionary.Values (но не с самим словарем). Но да, List
, возможно, более подходит.
Похоже, вам нужен словарь словарей; что (как я обнаружил) довольно часто встречается в командных и многопользовательских сценариях; например
// ... 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.
Обычно вы «заполняете» эти словари проигрывателями (при запуске и подключении), поэтому вам не нужно каждый раз выполнять проверку «содержит проигрыватель».
Похоже, ключ в твоем словаре стоит не на том месте...