Подтвердить что ты не робот

Словарь С# с двумя значениями на ключ?

У меня есть ситуация в коде, где Dictionary<string, string> показалась лучшей идеей - мне нужна коллекция этих объектов, и мне нужно, чтобы они были доступны через уникальный ключ. Именно для концепции словаря, правильно?

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

Итак, я рисую, расширяя концепцию, чтобы создать новую структуру данных со строкой и булевым, и теперь это будет Dictionary<string, NewCustomObject>.

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

Имеет ли только словарь пользовательских объектов лучший способ обойти это или есть что-то более простое для этого сценария?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

class MappedValue
{
    public string SomeString { get; set; }
    public bool SomeBool { get; set; }
}

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;

Ответ 4

Я думаю, что в целом вы попадаете в концепцию Tuples - что-то вроде Tuple<x, y, z> или Tuple<string, bool, value>.

С# 4.0 будет иметь динамическую поддержку кортежей, но кроме этого вам нужно перевернуть свой собственный или загрузить библиотеку Tuple.

Здесь вы можете увидеть мой ответ, где я поместил некоторый пример кода для универсального класса кортежей. Или я могу просто перепечатать его здесь:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}

Ответ 5

В .NET4 вы можете использовать (unchecked): Dictionary<string, Tuple<bool,string>>

Ответ 6

Я не верю .net имеет встроенную Multi-Map, которая обычно представляет собой структуру данных, которую вы можете использовать для создания этого типа хранилища. С другой стороны, я не думаю, что это излишне, просто используя пользовательский объект, который содержит как строку, так и логическую.

Ответ 7

Разве это не работает для ya?

Dictionary<string, List<string>>

Или вы можете использовать Tuple и иметь словарь этого:

Dictionary<string, Tuple<string, bool>>

Ответ 8

Tuple всегда является хорошим решением. Кроме того, в объектно-ориентированном подходе всегда предпочитают состав над наследованием. Построить составной объект, выполняющий группировку. Просто. Я думаю, что здесь вы найдете несколько приятных и чистых решений, от других пользователей.:)

Ответ 9

Словарь - это всего лишь набор объектов с ключом. Таким образом, он будет содержать любой тип объекта, который вы хотите. Даже самый простой из объектов, например, массив (который происходит от Object), но требует от вас намного меньше кода.

Вместо того, чтобы писать целый класс, введите динамически выделенный массив или список в значение и запустите с ним.

Словари очень гибки.

Ответ 10

Как насчет Поиск класса?

Edit:

После прочтения вопроса внимательно подумайте, что это не лучшее решение, но оно по-прежнему является хорошим для словаря с некоторыми значениями за один ключ.

Ответ 11

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