سؤال

لقد كنت أستخدم لغة #C لفترة طويلة، ولم أجد أبدًا طريقة سهلة لإنشاء تجزئة جديدة.

لقد تعرفت مؤخرًا على بناء جملة روبي للتجزئة والعجب، هل يعرف أحد طريقة بسيطة للإعلان عن التجزئة كقيمة حرفية، دون إجراء جميع مكالمات الإضافة.

{ "whatever" => {i => 1}; "and then something else" => {j => 2}};
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم C# 3.0 (.NET 3.5)، فيمكنك استخدام مُهيئات المجموعة.إنهم ليسوا مقتضبين تمامًا كما هو الحال في روبي ولكنهم لا يزالون في تحسن.

ويستند هذا المثال على مثال 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, }}
};

نصائح أخرى

عندما لا أتمكن من استخدام الإصدار 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
);

نظرًا لأنه يمكن تحديد القيم الحرفية القابلة للتجزئة في الإصدار C# 3.0 (.NET 3.5) على النحو التالي:

var ht = new Hashtable {
    { "whatever", new Hashtable {
            {"i", 1} 
    } },
    { "and then something else", new Hashtable { 
            {"j",  2}
    } }
};
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;            
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top