.NET "обратимый" словарь, где ключи и значения могут быть обменены - PullRequest
4 голосов
/ 27 сентября 2010

Существует ли какой-либо тип .NET, который представлял бы набор пар ключ-значение, где каждый ключ будет связан только с одним значением (например, обычный Dictionary), но также каждое значение будет связано только с одним ключ? Я думал об этом как об «обратимом» словаре, потому что вы могли менять ключи на значения без каких-либо коллизий. Это не должно быть сложно написать такой класс, и добавить методы, такие как «TryGetKey» для данного значения. Тем не менее, я хотел проверить, существует ли такая вещь где-то, возможно, под другим именем, о котором я даже не думал.

Кроме того, учитывая элегантный ответ на этот вопрос , стоило бы мне создать класс для представления этого обратимого словаря, когда я мог бы так же легко использовать LINQ для преобразования любого словаря в его значение -эквивалент?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2010

Я не верю, что в рамках есть класс, который делает это напрямую.

Кроме того, учитывая элегантный ответ на этот вопрос, стоило ли бы мне создать класс для представления этого обратимого словаря, когда я мог бы так же легко использовать LINQ для преобразования любого словаря в его эквивалент ключа значения? *

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

Хотя это можно сделать очень и очень легко. Просто оберните два экземпляра Dictionary внутри вашего класса, и, когда вы добавите новый элемент, добавьте к обоим - один с ключом / значением и один со значением / ключом. Ваши подпрограммы поиска могут просто извлечь из соответствующей коллекции, и она останется около O (1) для времени доступа.

Если, однако, больше беспокоит память, вы можете просто использовать одну коллекцию и использовать LINQ для ее анализа. Это сделает ваш «обратный» поиск немного медленнее, так как вам придется каждый раз пересматривать.

1 голос
/ 27 сентября 2010

Если вам действительно нужна такая структура данных, вам, вероятно, не понадобятся дополнительные затраты на ее преобразование при каждом поиске. То есть, если бы у вас был обычный Dictionary<string,int>, каждый раз, когда вы выполняли поиск по значению, вам пришлось бы проходить это преобразование. Вы можете оптимизировать его, чтобы преобразование выполнялось только в том случае, если словарь изменился (т. Е. Был добавлен, удален или изменен элемент), но это все равно будет довольно высокой ценой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...