Как вы можете правильно создать экземпляр типа кортежа?

#c# #dictionary #collections #enums #tuples

#c# #словарь #Коллекции #перечисления #Кортежи

Вопрос:

Наличие этих перечислений ReportType, ReportField and ReportDimension со следующей спецификацией:

В принципе, у меня есть три типа отчетов, и каждый из них в некотором роде уникален, один поддерживает некоторые поля отчета и некоторые измерения отчета (не имеет значения, какие именно), я хотел бы создать словарь, содержащий 3 элемента KeyValuePair (для каждого типа отчета) и имеющий tuple в качестве значения, которое выглядит следующим образом:

 private readonly Dictionary<ReportType, (List<ReportField>, List<ReportDimension>)> _reportTypeDimensionMappings;
  

Я хотел напрямую создать экземпляр этой структуры, но то, как я собираюсь это сделать, приводит к ошибкам сборки:

 private readonly Dictionary<ReportType, (List<ReportField>, List<ReportDimension>)> _reportTypeDimensionMappings = new Dictionary<ReportType,
        (List<ReportField>, List<ReportDimension>)>
    {
        {ReportType.Session, new (List<ReportField>, List<ReportDimension>)
            {
                new List<ReportField>
                {

                },
                new List<ReportDimension>
                {

                }
            }
        },

    };
  

Существует ли явный практический способ создания экземпляра значения словаря, который является кортежем?

Комментарии:

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

2. Я не уверен, почему вы это говорите, его цель — создать жестко запрограммированное бизнес-сопоставление между типами отчетов, полями и измерениями, используемыми для проверки, вы легко видите, что вы сопоставили для этого типа отчета

3. я бы рассмотрел возможность использования класса для этого.

Ответ №1:

Уже было высказано предположение, что здесь не следует использовать кортеж, и я согласен, но, отвечая на ваш вопрос, синтаксис довольно прост:

 private readonly Dictionary<ReportType, (List<ReportField>, List<ReportDimension>)> _reportTypeDimensionMappings = 
    new Dictionary<ReportType, (List<ReportField>, List<ReportDimension>)>
    {
        {ReportType.Session, (new List<ReportField>(), new List<ReportDimension>()) }
    };
  

Ответ №2:

Похоже, что класс лучше подошел бы для того, что вам нужно. Вы могли бы создать класс с именем, Report который содержит ваши свойства List<ReportField> и List<ReportDimension> .

Кортежи полезны, когда вам нужна недолговечная, относительно небольшая коллекция значений или объектов, которую нужно рассматривать как нечто единое (т. Е. возвращаемое из метода), но на самом деле создание выделенного класса для таких типов объектов также не требует больших затрат. Как отметил Дэниел А. Уайт в разделе ваших комментариев, это затрудняет чтение вашего кода, и, учитывая, что вам не нужно много причин для создания класса для каких-либо целей, я бы сказал, что любой причины достаточно.

Комментарии:

1. Что ж, решить это не было проблемой, я подумал о вашем решении, а также вы можете решить это с помощью дополнительного словаря, и каждый словарь будет сопоставлен только одному списку<ReportField> /List<ReportDimension>. Я хотел посмотреть, есть ли решение о том, как вы можете напрямую создать экземпляр этого кортежа

Ответ №3:

Вы можете создать объект кортежа, вызвав Tuple t = Tuple.Create(object1, object2); затем вы можете получить значения с помощью t.Item1 for object1 и t.Item2 for object2

Комментарии:

1. С C # 7 создать кортеж еще проще: (объект 1, объект 2). Обратите внимание, что это кортеж типа значения по сравнению с System.Tuple , который является ссылочным типом.