Буквальные хеши в с #?

Я давно занимаюсь C# и никогда не встречал простого способа просто создать новый хеш.

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

{ "whatever" => {i => 1}; "and then something else" => {j => 2}};
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
30
0
5 902
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы используете C# 3.0 (.NET 3.5), вы можете использовать инициализаторы коллекций. Они не такие краткие, как в Ruby, но все же являются улучшением.

Этот пример основан на Пример MSDN

var students = new Dictionary<int, StudentName>()
{
    { 111, new StudentName {FirstName = "Sachin", LastName = "Karnik", ID=211}},
    { 112, new StudentName {FirstName = "Dina", LastName = "Salimzianova", ID=317, }},
    { 113, new StudentName {FirstName = "Andy", LastName = "Ruth", ID=198, }}
};

Кстати: VisualStudio / ReSharper сообщает мне, что круглые скобки в new Dictionary <int, StudentName> () являются необязательными и избыточными. Сохраняет двух персонажей;)

Daren Thomas 10.06.2009 19:59

Когда я не могу использовать C# 3.0, я использую вспомогательную функцию, которая переводит набор параметров в словарь.

public IDictionary<KeyType, ValueType> Dict<KeyType, ValueType>(params object[] data)
{
    Dictionary<KeyType, ValueType> dict = new Dictionary<KeyType, ValueType>((data == null ? 0 :data.Length / 2));
    if (data == null || data.Length == 0) return dict;

    KeyType key = default(KeyType);
    ValueType value = default(ValueType);

    for (int i = 0; i < data.Length; i++)
    {
        if (i % 2 == 0)
            key = (KeyType) data[i];
        else
        {
            value = (ValueType) data[i];
            dict.Add(key, value);
        }
    }

    return dict;
}

Используйте так:

IDictionary<string,object> myDictionary = Dict<string,object>(
    "foo",    50,
    "bar",    100
);

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

namespace Dictionary
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();                
            Dictionary<object, object > d = p.Dic<object, object>("Age",32,"Height",177,"wrest",36);//(un)comment
            //Dictionary<object, object> d = p.Dic<object, object>();//(un)comment

            foreach(object o in d)
            {
                Console.WriteLine(" {0}",o.ToString());
            }
            Console.ReadLine();    
        }

        public Dictionary<K, V> Dic<K, V>(params object[] data)
        {               
            //if (data.Length == 0 || data == null || data.Length % 2 != 0) return null;
            if (data.Length == 0 || data == null || data.Length % 2 != 0) return new Dictionary<K,V>(1){{ (K)new Object(), (V)new object()}};

            Dictionary<K, V> dc = new Dictionary<K, V>(data.Length / 2);
            int i = 0;
            while (i < data.Length)
            {
                dc.Add((K)data[i], (V)data[++i]);
                i++;    
            }
            return dc;            
        }
    }
}

Начиная с C# 3.0 (.NET 3.5) литералы хеш-таблицы могут быть указаны следующим образом:

var ht = new Hashtable {
    { "whatever", new Hashtable {
            {"i", 1} 
    } },
    { "and then something else", new Hashtable { 
            {"j",  2}
    } }
};

Другие вопросы по теме