সি # তে একটি "ইনলাইন" অ্যারে ব্যবহার করতে পারবেন না?


92

আপনার কোথাও এই ধারণা আছে

public static T AnyOne<T>(this T[] ra) where T:class
    {
    int k = ra.Length;
    int r = Random.Range(0,k);
    return ra[r];
    }

বা এমনকি এই

public static string OneOf(this string[] strings)
    {
    return "a";
    }

তাহলে, অবশ্যই আপনি এটি করতে পারেন ...

string[] st = {"a","b","c"};
string letter = st.AnyOne();

... যা মহান. কিন্তু এটি প্রদর্শিত হবে আপনি এটি করতে পারবেন না:

string letter = {"a","b","c"}.AnyOne();

বা সত্যিই সম্ভবত এই

string letter = ( {"a","b","c"} ).AnyOne();

বা অন্য কিছু চেষ্টা করেছিলাম।

আসলে (1) কেন কেউ তা করতে পারে না? এবং (২) আমি কিছু মিস করছি, যদি কোনও উপায় থাকে তবে আপনি কীভাবে তা করবেন?


4
ডুপ্লিকেট প্রশ্নটি উপযুক্ত কিনা তা আমি নিশ্চিত নই, ওপি অ্যারে প্রারম্ভিকদের সম্পর্কে জিজ্ঞাসা করছে না, তবে সংকলক কেন নির্ধারিত না হওয়া অবধি বিষয়টিটিকে অ্যারে হিসাবে স্বীকৃতি দেবে না।
— রন বায়ার

4
আমি সি # টার্মিনোলজির সাথে পরিচিত নই তবে আমি বিশ্বাস করি এটিকে সাধারণত ইনলাইন না করে আক্ষরিক বা অ্যারে আক্ষরিক বলা হয় ।
— চি

4
সেই সিনট্যাকটিক উপাদানটি ব্যবহৃত হয় এমন প্রসঙ্গে নির্ভর করে একটি অ্যারে ইনিশিয়ালাইজার বা সংগ্রহের আরম্ভকারী is উভয় ক্ষেত্রেই এটি একটি অভিব্যক্তি হিসাবে শ্রেণীবদ্ধ করা হয় ।
— এরিক লিপার্ট

উত্তর:


133

আপনাকে প্রথমে অ্যারে তৈরি করতে হবে new[]।

string letter = (new[] {"a","b","c"}).AnyOne();

@ এইচভিডি উল্লিখিত হিসাবে আপনি প্যারান্থিস ছাড়াই এটি করতে পারেন (..), আমি প্যারান্থিসগুলি যুক্ত করেছি কারণ আমি মনে করি এটি আরও পঠনযোগ্য।

string letter = new[] {"a","b","c"}.AnyOne();

এবং আপনি new string[]অন্যান্য উত্তর হিসাবে তথ্য টাইপ নির্দিষ্ট করতে পারেন ।


আপনি কেবল এটি করতে পারবেন না {"a","b","c"}, কারণ আপনি এটিকে অ্যারে তৈরি করার উপায় হিসাবে ভাবতে পারেন, এটি তৈরি করার জন্য নয়।

আর একটি কারণ হ'ল সংকলকটি বিভ্রান্ত হবে, কী তৈরি করতে হবে তা জানে না, উদাহরণস্বরূপ, এ string[]{ .. }বা এ List<string>{ .. }।

শুধু new[]সংকলক ব্যবহার করে ডেটা টাইপ ( "..") এর মধ্যে {..}আপনি কী চান ( string) এর মাধ্যমে জানতে পারবেন। অপরিহার্য অংশটি হল এর []অর্থ আপনি একটি অ্যারে চান।

আপনি এটির সাথে একটি খালি অ্যারেও তৈরি করতে পারবেন না new[]।

string[] array = new []{ }; // Error: No best type found for implicity-typed array

13
আপনার এই প্রথম বন্ধনীর দরকার নেই। string letter = new[] {"a","b","c"}.AnyOne();ঠিক আছে। যদি আপনি এগুলি চান, যদি আপনি মনে করেন যে এটি প্রথম বন্ধনীগুলির সাথে আরও পঠনযোগ্য, সেগুলি বৈধ, তবে সেই ক্ষেত্রে আমি মনে করি এটি কমপক্ষে উল্লেখ করা উচিত যে এটি আপনার পক্ষ থেকে সচেতন পছন্দ, এটি ভাষা দ্বারা জোর করা হয়নি।

আমি সিনট্যাক্স নতুন [] {1,2 about সম্পর্কে জানি, তবে এর থেকেও আরও সহজ বাক্য গঠন আছে? [1, 2] এর মতো কিছু?
— সেগুসো

51

(1) কেন কেউ তা করতে পারে না? {"a","b","c"}.AnyOne();

এই লাইন:

string[] st = {"a","b","c"};

সমতুল্য অ্যারে তৈরির প্রকাশের জন্য একটি ছোট হাত ( আইএলপিএস এর অধীনে )

string[] st = new string[]  {"a","b","c"};

এটি string[] st = {"a","b","c"} কেবল ঘোষণার সময় ব্যবহার করা যেতে পারে , আপনি এটি অন্য কোথাও ব্যবহার করতে পারবেন না, আপনি এটি করতেও পারবেন না:

string[] st;
st = {"a", "b", "c"}; //Error

এটি # specific...১০.৪ এর অধীনে সি # ভাষার স্পেসিফিকেশনে অ্যারে ক্রিয়েশন এক্সপ্রেশনটির জন্য ব্যাখ্যা করা হয়েছে ।

সুতরাং "{"a", "b", "c"}"ঘোষণায় ব্যবহার ছাড়াই একা এর অর্থ কিছুই নয়। সুতরাং আপনার এক্সটেনশন পদ্ধতিটি অ্যারেতে চালিত হওয়ায় আপনি এটি আপনার সম্প্রসারণ পদ্ধতিতে ব্যবহার করতে পারবেন না।

(২) আমি কিছু মিস করছি, যদি কোনও উপায় থাকে তবে আপনি কীভাবে তা করবেন?

@ অ্যাড্রিকাদের উত্তরে ইতিমধ্যে উল্লেখ করা হয়েছে , আপনি এটি করতে পারেন:

(new[] {"a","b","c"}).AnyOne();

বা

(new string[] {"a","b","c"}).AnyOne();

48

আমি "কেন নয়" প্রশ্নগুলিকে পিছনে ঠেলেছি কারণ প্রথম, উত্তরগুলি প্রায় সন্তোষজনক নয় - আপনি ইতিমধ্যে উত্তরটি অর্জন করেছেন "বৈশিষ্ট্যটি আপনি এটি চান এমন উপায় নয় কারণ স্পেসিফিকেশন আপনি যা বলতে চান তা বলে না" , যা আমি কল্পনা করি না এটি একটি বিশেষ সন্তুষ্ট উত্তর ছিল না। দ্বিতীয়ত, ডিজাইন দলটিকে ন্যায়সঙ্গত করতে হবে না যে পৃথিবী আপনি যেভাবে চান তা কেন নয় ; বৈশিষ্ট্যগুলি নিখরচায় বিদ্যমান নেই এবং তারপরে ভাষার বাইরে ডিজাইন করা হয়েছে; পরিবর্তে, বৈশিষ্ট্যগুলি প্রথমে ন্যায়সঙ্গত হতে হবে এবং তারপরে ডিজাইন করা উচিত।

সুতরাং আসুন আপনার "কেন নয়" প্রশ্নটি আরও কিছুটা খাস্তা করার চেষ্টা করি। বিদ্যমান বৈশিষ্ট্যটি হ'ল "একটি অ্যারে ইনিশিয়ালাইজার ব্যবহার করা যেতে পারে (ক) একটি সূচনাতে সমান ডান দিকে বা (খ) অ্যারের ধরণের একটি অবজেক্ট নির্মাণের ডানদিকে।" প্রস্তাবিত বৈশিষ্ট্যটি হ'ল: "একটি অ্যারে ইনিশিয়ালাইজারটি এক্সপ্রেশন হিসাবেও ব্যবহৃত হতে পারে"। প্রশ্নটি "এরিক প্রস্তাবিত বৈশিষ্ট্যটি নিয়ে কী সমালোচনা করবেন?"

আমি প্রথম সমালোচনা করব যে এটি প্রকাশের ধরণটি কী তা পরিষ্কার নয়। একটি ভেরিয়েবল ইনিশিয়ালাইজারে আপনার ভেরিয়েবলের ধরণ থাকে এবং একটি অবজেক্ট তৈরির এক্সপ্রেশনে আপনার অবজেক্টের ধরণ থাকে; এই উভয় থেকে আমরা নির্মিত অ্যারের ধরণের করতে পারি। উভয়ই ইঙ্গিত ছাড়াই আমাদের কোন ধরণের অনুমান করা উচিত?

সি # 1.0 এ, যখন এই বৈশিষ্ট্যটি যুক্ত করা হয়েছিল, তখন ভাষায় তৈরি করা হয়েছিল শূন্য প্রকারের এক বৃহত আকার। সি # এর প্রথম দিনগুলির একটি নকশার নীতিটি ছিল "কোনও আশ্চর্য" নয়, এবং সংকলকটি "খুব স্মার্ট" ছিল না। বিকাশকারী যদি কোনও অভিব্যক্তিটি নির্দিষ্ট ধরণের হতে চান তবে সেই ধরণেরটি কোনওভাবেই প্রকাশের ক্ষেত্রে স্পষ্ট হওয়া উচিত। যখন আপনি বলে

new double[] { 1, 2, 3.4 }

এটি কি ধরণের উদ্দেশ্য তা বেশ পরিষ্কার। একইভাবে

new Animal[] { cat, dog, null }

প্রস্তাবিত বৈশিষ্ট্যটি এই নীতিটিকে লঙ্ঘন করে। অভিব্যক্তিটির অবশ্যই একটি প্রকার থাকতে হবে তবে যুক্তিটির ধরণ কী তা তা কোনওভাবেই পরিষ্কার হয় না

M({cat, dog, null})

অধিকন্তু: ধরুন আমাদের দুটি ওভারলোড হয়েছে Mযার একটির মধ্যে একটি অ্যারে নেয় Animalএবং অন্যটি অ্যারে নেয় IPet। কোন ওভারলোড Mপ্রযোজ্য? একটি রূপান্তর অন্যর চেয়ে ভাল? উপাদানগুলির ধরণগুলি হ'ল Catএবং Dog; এমন কোনও ধরণের সংস্থান করা কী বোঝায় যে এটি সেখানে উপস্থিত হয় না? এগুলি এমন সমস্ত প্রশ্ন যা অবশ্যই ডিজাইন দল দ্বারা বিবেচনা করা উচিত এবং এগুলি এমন প্রশ্ন যাগুলির কোনও কারণেই সুস্পষ্ট উত্তর নেই। প্রস্তাবিত বৈশিষ্ট্যটি আপনাকে বেশ স্বল্প ক্রমে গভীর জলে নিয়ে যায়।

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

এটা হতে পারতো. বৈশিষ্ট্যটি আসলে সি # 3.0 এ যুক্ত হয়েছিল:

new[] { x, y, z }

অ্যালগরিদম ব্যবহার করে অ্যারের প্রকারটি অনুমান করা হয়: যে উপাদানগুলির মধ্যে প্রকার রয়েছে সেগুলির জন্য অভিব্যক্তি গ্রহণ করুন, এই ধরণেরগুলির মধ্যে কোনটি অনন্য সর্বাধিক সাধারণ ধরণের যা অন্যান্য সমস্ত অভিব্যক্তি রূপান্তরযোগ্য, এবং যদি এই ধরণের উপস্থিত থাকে তবে তা চয়ন করুন। অন্যথায় একটি ত্রুটি উত্পাদন,

এই বৈশিষ্ট্যটি Thatচ্ছিক করতে আরও শিথিল করা যেতে পারে new[]। এটি করা হয়নি।

এখন, আপনি যদি আমাকে সি # 3.0 টাইমফ্রেমে প্রস্তাবিত বৈশিষ্ট্যটির সমালোচনা করতে বলেছিলেন তবে আমি চিহ্নিত করতাম যে (1) সি # 3.0 সংকলকটি ইতিমধ্যে পুরো প্রকাশের সময়সূচী পিছলে যাওয়ার মারাত্মক বিপদে রয়েছে, সুতরাং আসুন আমরা আর যুক্ত না করি পুরোপুরি অপ্রয়োজনীয় বৈশিষ্ট্যটির জন্য ডিজাইন, বাস্তবায়ন এবং পরীক্ষার বোঝা যা ব্যবহারকারীর ছয়টি কীস্ট্রোক সংরক্ষণ করে এবং (2) সি # 3.0 এছাড়াও সংগ্রহের সূচনা যোগ করেছে:

new List<int>() { 10, 20, 30 }

কেন {10, 20, 30}স্বয়ংক্রিয়ভাবে একটি অ্যারে হওয়া উচিত ? এটা কেন হবে না List<int>? বা অন্যান্য ধরণের কোন একটি? অ্যারের প্রতি পক্ষপাতিত্ব কেন? মনে রাখবেন, একবার আমরা অ্যারেগুলির জন্য সিনট্যাক্সটি সন্নিবিষ্ট করা বেছে নিলে আমরা চিরকালের জন্য এটিতে আটকে আছি । এটি কখনও অন্য কিছু হতে পারে না, সুতরাং প্রস্তাবিত বৈশিষ্ট্যটি কেবল অপ্রয়োজনীয় নয়, এটি ভবিষ্যতের সম্ভাব্য বৈশিষ্ট্যগুলিও প্রশ্রয়জনক বলে মনে করে preven

সংশ্লেষ: প্রস্তাবিত বৈশিষ্ট্যটি সি # 1.0 এর কিছু নকশার নীতিগুলি সরাসরি লঙ্ঘন করেছে। এটি সি # 3.0 তে অপ্রয়োজনীয় বোঝা ব্যতীত আর কিছুই যুক্ত করে না। সি # 3.0 থেকে ভাষার সমস্ত সংস্করণে, প্রস্তাবিত বৈশিষ্ট্যটির আরও অনেক উপযুক্ত বৈশিষ্ট্যগুলির চেয়ে এটিতে সময়, প্রচেষ্টা এবং অর্থ ব্যয় করার সুপারিশ করার পক্ষে কোনও ভাল যুক্তি নেই।

অতএব, এ জাতীয় কোনও বৈশিষ্ট্য নেই।


হেই, আপনার সাথে একটি টি-শার্ট মুদ্রিত হওয়া দরকার "বিশ্বের যেভাবে আপনি চান" এটি মুদ্রিত হতে পারে না :)
— স্লাগস্টার

6
@ জো ব্লো: প্রথমে আপনাকে স্বাগতম! "কেন নয়" সম্পর্কিত - আপনার মন্তব্য সমস্যাটিকে সুন্দরভাবে চিত্রিত করে। কিছু লোক যখন "কেন" প্রশ্ন জিজ্ঞাসা করে তারা যৌক্তিক ন্যায়সঙ্গততার সন্ধান করে । কিছু লোক একটি বাস্তববাদী ন্যায়সঙ্গত খুঁজছেন । এবং আপনি স্পষ্টতই বিধি বর্ণনার বিবরণীর রেখাটি সন্ধান করছেন । এটি এতই অস্পষ্ট যে একটি ভাল উত্তর তৈরি করা খুব কঠিন যে প্রশ্নটি আসলে প্রশ্নকারীর মনে লক্ষ্য করে। "কেন নয়" প্রশ্নগুলি আরও খারাপ কারণ তারা এমন জিনিসগুলি সম্পর্কে অস্পষ্ট প্রশ্ন যা এমনকি বিদ্যমান নেই ।
— এরিক লিপার্ট

4
@EricLippert এটা ঠিক চেয়ে আরও খারাপ বিষয় আছে যা _might_ থাকবেই প্রশ্ন : আপনি যদি কোনও দলের সাথে সফ্টওয়্যার নিয়ে কাজ করছেন তবে পুরো দলটি বছরের প্রতিটি দিন বৈশিষ্ট্যগুলি নিয়ে চিন্তা করে এবং ফলাফলগুলি ভারসাম্য বজায় রাখে। সিদ্ধান্ত নেওয়া হয়। বৈশিষ্ট্য অনুরোধ এবং 'কেন' ন্যায্যতা জিজ্ঞাসা। যাইহোক, কেন বোঝানো হচ্ছে না যে কেউ কেবল কিছু করা চায়, যা মূলত দলের রায়কে প্রশ্নবিদ্ধ করে। খারাপ, ব্যক্তি জিজ্ঞাসা কেন প্রশ্ন সাধারণত সামান্য বিষয় সম্পর্কে জানেন। যেমনটি, আমি মনে করি কেন প্রশ্নগুলি সম্পূর্ণ ন্যায্য নয় on ভাল কাজ আইএমও।
— আটলস্টে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.