সি # তে অভিধানের জন্য আক্ষরিক স্বরলিপি?


181

আমার কাছে বর্তমানে জাভাস্ক্রিপ্ট এবং সি # তে প্রোগ্রামযুক্ত একটি সার্ভারের মধ্যে একটি ওয়েবসকেট রয়েছে। জাভাস্ক্রিপ্টে, আমি কোনও এসোসিয়েটিভ অ্যারে ব্যবহার করে সহজেই ডেটা পাস করতে পারি:

var data = {'test': 'val',
            'test2': 'val2'};

সার্ভারে এই ডেটা অবজেক্টটি উপস্থাপন করতে আমি একটি ব্যবহার করি Dictionary<string, string>তবে এটি জাভাস্ক্রিপ্টের চেয়ে 'টাইপিং-ব্যয়বহুল':

Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");

Dictionaryসি # তে এসোসিয়েটিভ অ্যারেগুলির জন্য কি কোনও ধরণের আক্ষরিক স্বরলিপি রয়েছে ?


সি # 9 অভিধান অভিধানের জন্য একটি প্রস্তাব রয়েছে। আমি নীচে এটি সম্পর্কে একটি উত্তর পোস্ট । আমাদের স্বপ্ন বাস্তব!
এলোআইএসডিজি

উত্তর:


291

আপনি সংগ্রহ আরম্ভকারী সিনট্যাক্স ব্যবহার করেন , তবে new Dictionary<string, string>শর্টকাট সিনট্যাক্সের Add()কলগুলিতে (আপনার কোডের মতো) অনুবাদ করা হওয়ায় আপনাকে প্রথমে কোনও বিষয় তৈরি করতে হবে :

var data = new Dictionary<string, string>
{
    { "test", "val" }, 
    { "test2", "val2" }
};

সি # 6 এ আপনার কাছে এখন অভিধান সহ আরও স্বজ্ঞাত সিনট্যাক্স ব্যবহার করার পাশাপাশি ইন্ডেক্সারদের সমর্থনকারী অন্য কোনও ধরণের বিকল্প রয়েছে । উপরের বিবৃতিটি আবার লিখিত হতে পারে:

var data = new Dictionary<string, string>
{
    ["test"] = "val",
    ["test2"] = "val2"
};

সংগ্রহ আরম্ভকারীদের বিপরীতে, এটি উপযুক্ত Add()পদ্ধতির পরিবর্তে হুডের নীচে সূচকগুলির সেটারটি আহ্বান করে ।


2
ধন্যবাদ। Dictionary<string, string>যদিও এটির একটি অপসারণ করা সম্ভব ? এটি বরং অপ্রয়োজনীয় বলে মনে হচ্ছে তবে আমি ভুল হতে পারি। সম্পাদনা করুন: এটি প্রকৃতপক্ষে আরও পছন্দনীয় উপায় বলে মনে হচ্ছে, আপনাকে ধন্যবাদ।
pimvdb

3
@ পিমভিডিবি: হ্যাঁ আপনি করতে পারেন: এটিকে হিসাবে ঘোষণা করুন, সংকলকটি এর varথেকে প্রকারটি নির্ধারণ করবে new। আমি আমার উত্তর সম্পাদনা করেছি।
বোল্টক্লক

7
মনে রাখবেন যে এটি আক্ষরিক স্বরলিপি নয়, কঠোরভাবে বলতে ... এটি আরম্ভের জন্য কেবল একটি শর্টকাট। কেবল স্ট্রিং এবং কিছু আদিম ধরণের একটি আক্ষরিক উপস্থাপনা রয়েছে
টমাস লেভেস্ক

যদি আপনি বোঝাতে চান যে আপনি "স্ট্রিং" গুলিগুলির একটি অপসারণ করতে চান - সেগুলি অনর্থক নয় - একটি মূল প্রকারের জন্য, অন্যটি মান ধরণের জন্য। ডিকোরিয়ানের জন্য কোনও আক্ষরিক নির্দিষ্ট নেই, এই উত্তরে ব্যবহৃত স্বরলিপিটি একটি অ্যাড পদ্ধতি সহ সমস্ত শ্রেণীর জন্য সাধারণ যা দুটি স্ট্রিং নেয় (এবং আইনিউবারেবল প্রয়োগ করে)।
মার্কাস জনসন

1
@ মারকাস জনসন: তার অর্থ ছিল, আক্ষরিক Dictionary<string, string>,। আমার কোডটি মূলত প্রকারটি ঘোষণা করেছিল, আমি varতার মন্তব্যের পরে এটিকে পরিবর্তন করেছিলাম ।
বোল্টক্লক

13

যদিও অভিধান সূচনার উত্তরটি সম্পূর্ণ সঠিক, এর আরও একটি পন্থা রয়েছে যা আমি উল্লেখ করব (তবে আমি এটি সুপারিশ করতে পারি না)। যদি আপনার লক্ষ্যটি সংশ্লেষের এপিআই ব্যবহার সরবরাহ করা হয়, আপনি বেনামে অবজেক্টগুলি ব্যবহার করতে পারেন।

var data = new { test1 = "val", test2 = "val2"};

"ডেটা" ভেরিয়েবলটি তখন "অবর্ণনীয়" বেনামে টাইপের হয়, সুতরাং আপনি কেবল এটিকে পাশ হিসাবে পাস করতে পারেন System.Object। তারপরে আপনি এমন কোনও কোড লিখতে পারেন যা একটি অনামী অবজেক্টকে অভিধানে রূপান্তর করতে পারে। এই জাতীয় কোড প্রতিবিম্ব উপর নির্ভর করবে, যা সম্ভবত ধীর হবে। তবে আপনি ব্যবহার করতে System.Reflection.Emitবা System.Linq.Expressionsএকটি প্রতিনিধি সংকলন এবং ক্যাশে করতে পারেন যা পরবর্তী কলগুলি আরও দ্রুত করতে পারে।

Asp.net এমভিসি এপিআইগুলি আমি দেখেছি এমন বেশ কয়েকটি স্থানে এই কৌশলটি ব্যবহার করে। এইচটিএমএল সাহায্যকারীদের অনেকেরই ওভারলোড রয়েছে যা কোনও বস্তু বা অভিধান গ্রহণ করে। আমি ধরে নিচ্ছি যে তাদের এপিআই ডিজাইনের লক্ষ্যটি আপনার পরে যেমন রয়েছে; পদ্ধতি কল এ সংশ্লেষ ছড়িয়ে।


1
কীগুলি সেট স্থিতিশীল হলে কেবল এটিই সহায়তা করবে। আপনি একই উদ্দেশ্যে টিপলস ব্যবহার করতে পারেন।
sehe

8

ব্যবহার করে DynamicObject, একটি সহজ অভিধানের প্রাথমিককরণ তৈরি করা এতটা কঠিন নয়।

কল্পনা করুন আপনি নীচের পদ্ধতিটি কল করতে চান

void PrintDict(IDictionary<string, object> dict) {
    foreach(var kv in dict) {
        Console.WriteLine ("  -> " + kv.Key + " = " + kv.Value);
    }
}

একটি আক্ষরিক সিনট্যাক্স ব্যবহার করে

var dict = Dict (Hello: "World", IAm: "a dictionary");
PrintDict (dict);

এটি এর মতো একটি গতিশীল অবজেক্ট তৈরি করে সম্পন্ন করা যায়

dynamic Dict {
    get {
        return new DynamicDictFactory ();
    }
}

private class DynamicDictFactory : DynamicObject
{
    public override bool TryInvoke (InvokeBinder binder, object[] args, out object result)
    {
        var res = new Dictionary<string, object> ();
        var names = binder.CallInfo.ArgumentNames;

        for (var i = 0; i < args.Length; i++) {
            var argName = names [i];
            if(string.IsNullOrEmpty(argName)) throw new ArgumentException();
            res [argName] = args [i];
        }
        result = res;
        return true;
    }
}

6

অভিধানের লিটারালগুলি ব্যবহার করুন (সি # 9 প্রস্তাব)

সি # 9 Dictionary<TKey,TValue>অভিধানের প্রকারের নাম বা প্রকারের প্যারামিটারগুলি নির্দিষ্ট না করেই সূচনাযুক্ত বস্তু তৈরির জন্য একটি সহজ বাক্য গঠন সূচনা করে। অ্যারের ধরণের অনুক্রমের জন্য ব্যবহৃত বিদ্যমান বিধিগুলি ব্যবহার করে অভিধানের ধরণের পরামিতিগুলি অনুমান করা হয়।

// C# 1..8    
var x = new Dictionary <string,int> () { { "foo", 4 }, { "bar", 5 }};   
// C# 9    
var x = ["foo":4, "bar": 5];  

এই সিনথ্যাক্স সি # তে অভিধান এবং রিডান্ট্যান্ট কোড সরানোর সাথে অভিধানগুলি দিয়ে কাজ করে।

আপনি সমস্যাটি গিটহাবটিতে অনুসরণ করতে পারেন (এবং এটি সি # 9 এর মাইলফলক )।

সম্পাদনা করুন: এই প্রস্তাবটি বর্তমানে প্রত্যাখ্যাত হয়েছে :

[...] আমরা মনে করি ডেটা শুরু করার চারপাশে বেশ কয়েকটি আকর্ষণীয় ব্যবহারের ঘটনা রয়েছে, বিশেষত অপরিবর্তনীয় অভিধানের মতো জিনিসগুলির জন্য। যে শব্দটি অতুলনীয় তা আরম্ভ করার জন্য আমরা বিদ্যমান সিনট্যাক্সটি খুঁজে পাই না, বা আমরা কোডটিতে একটি ঘনতীয় প্যাটার্ন হিসাবে দেখতে পাই না যা কোনও ভাষার বৈশিষ্ট্য থেকে অনেক উপকার করবে। আমরা জিনিসটি শুরু করি যে ডেটা শুরু করার সাধারণ ক্ষেত্রটি আমরা রেকর্ডগুলি এবং শুকিয়ে যাওয়ার পরে আবার দেখা উচিত। [...]


1
দুর্দান্ত ধারণা, আশা করি এটি এটিকে তৈরি করে দিয়েছে, মনে হচ্ছে কোনও
মস্তিষ্কের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.