Один ключ к множеству значений словаря в C #? [Дубликат]

На этот вопрос уже есть ответ здесь:

Многозначный словарь 9 ответов

Мне часто нужен один ключ для нескольких словарей vaules, но в C # большинство из них - это два измерения, такие как Dictionary и Hashtable.

Я хочу что-то вроде этого:

var d = new Dictionary();

дт внутри <> означает тип данных. У кого-нибудь есть идеи по этому поводу?

 Pete20 февр. 2013 г., 19:23
Вы'Мне нужно будет объяснить, что вы хотите немного лучше. Текущее объяснение нене могу ничего сказать. Приведите пример того, как вы можете использовать словарь, который вы себе представляете.
 Servy20 февр. 2013 г., 19:45
@GertArnold Это плохой вопрос, потому чтоСовершенно неоднозначно, что он хочет. Ожидает ли он многоключевой словарь, словарь с одним ключом и несколькими значениями, ожидает ли он нескольких ключейа также множественные значения и т. д. Он не ответил на уточняющие вопросы и вместо этого оставил вопрос как есть, несмотря на большую путаницу. Тот'вопрос низкого качества
 Drahcir20 февр. 2013 г., 19:28
Посмотрите этот похожий вопрос для некоторых идейstackoverflow.com/questions/689940/...
 Gisway20 февр. 2013 г., 19:24
Спасибо, Джастин, ты прав.не показывать здесь правильно из-за некоторых специальных символов в моем контенте.
 MethodMan20 февр. 2013 г., 19:23
Словарь требует 2 аргумента, так чего же вы в конечном итоге добиваетесь здесь?
 Gisway04 мая 2013 г., 08:49
используя Tuple в качестве значения в словаре, это то, что я хочу.
 Justin Chmura20 февр. 2013 г., 19:23
м, если вы хотите, чтобы пара ключ-значение со значением была списком? Это'допустимо делать:var d = new Dictionary(); или что вы хотите сохранить список.
 Pete20 февр. 2013 г., 19:26
Каков ключ вашего словаря? Строка? Или все, кроме последнего аргумента?
 Gert Arnold20 февр. 2013 г., 19:40
Так много павших голосов? Это'это не плохой вопрос, этоПросто дубликат.

Ответы на вопрос(4)

Опишите как соответствующие ключевые поля, так и соответствующие поля значений склассы. и использовать словарь этих типов.

var dictionary = new Dictionary();

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

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

var dictionary = new Dictionary();
Решение Вопроса

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

Теперь, если вы хотитеDictionary с 1 типом ключа и несколькими типами значений у вас есть несколько вариантов:

Во-первых, это использоватьTuple

var dict = new Dictionary()

Другой должен использовать (с C # 4.0 и выше):

var dict = new Dictionary()

System.Dynamic.ExpandoObject может иметь значение любого типа.

using System;
using System.Linq;
using System.Collections.Generic;

public class Test {
   public static void Main(string[] args) {
        dynamic d1 = new System.Dynamic.ExpandoObject();
    var dict = new Dictionary();
        dict[1] = d1;
        dict[1].FooBar = "Aniket";
        Console.WriteLine(dict[1].FooBar);
        dict[1].FooBar = new {s1="Hello", s2="World", s3=10};
        Console.WriteLine(dict[1].FooBar.s1);
        Console.WriteLine(dict[1].FooBar.s3);
   }
}
 vladimir12 окт. 2017 г., 15:48
не могли бы вы объяснить этоdict[1] = d1; dict[1].FooBar = "Aniket";? как я понялdic[1].FooBar = Aniket ключ для словаря, но что делаетFooBar в таком случае значит?
 Aniket Inge12 окт. 2017 г., 18:56
@vladimir the.FooBar в этом случае означает, что это может быть что угодно. Вы можете взять тот же код и заменить.FooBar с.vladimir и это все равно будет работать. Я динамически, во время выполнения, создал свойство вdict[1] (который указывает наd1) называетсяFooBar

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

Вы можете понять, что кортеж станет трудно читаемым кодом.

 Luis Filipe20 февр. 2013 г., 19:37
@ SystemDown: Спасибо за указание на это. Один из наиболее решающих для компромиссов
 System Down20 февр. 2013 г., 19:28
С оговоркой, что ему придется реализовать Equals () и GetHashCode () вручную.
 Servy20 февр. 2013 г., 19:37
@SystemDown That 'Значение true только если пользовательский класс является ключом; если оно'это значение, которое 'не нужно.
 goamn13 нояб. 2018 г., 02:32
Пожалуйста, создайте свой собственный класс, неTuple это использоватьЭто крайне неприемлемо.

Использоватькортеж в качестве ключа.

var d = new Dictionary();
 System Down20 февр. 2013 г., 19:30
@LukaszM - я так понял, что ему нужен составной ключ.
 Gisway20 февр. 2013 г., 19:29
Спасибо, это то, что я хочу. Я буду использовать это так: var d = new Dictionary <строка, Кортеж <строка, строка, BOOL, INT, любые-данные-typs >>();
 Lukasz M20 февр. 2013 г., 19:34
Понимаю. Я полагаю, он просто хотел коллекцию, которая объединяет более двух значений. Тем не мение,Tuple класс можно использовать в обоих случаях :).
 Gisway20 февр. 2013 г., 21:15
Да, в моем случае, потому что я хочу, чтобы набор данных с несколькими значениями составлял один ключ, var d = new Dictionary <строка, Кортеж <строка, строка, BOOL, INT, любой-типов данных >>(); Это то, что я хочу.
 Lukasz M20 февр. 2013 г., 19:29
Я бы предпочел использовать один из этих типов в качестве ключа, а Tuple <...> как ценность.
 System Down20 февр. 2013 г., 19:31
@Giswin - если вам нужен составной ключ, то это сработает. Это может стать немного уродливым, поскольку кортежи не описывают себя.

Ваш ответ на вопрос