অ-স্বজ্ঞাত সি # স্ট্রিং.স্প্লিট () বাস্তবায়নের পিছনে কারণগুলি


10

সি # তে আমি যদি stringঅন্যকে দিয়ে আলাদা করতে চাই তবে আমাকে stringএরকম কিছু করতে হবে:

testString.Split(new string[] { "anotherString" }, StringSplitOptions.None);

ওভারলোড হওয়া String.Splitএমএসডিএন ডকুমেন্টেশন থেকে আমরা বাস্তবায়ন দেখতে পাচ্ছি এবং কেন এইরকম কল করতে হবে।

পাইথন থেকে আগত , কেন এই ধরণের কল প্রয়োজন তা সঠিকভাবে বুঝতে আমার পক্ষে কঠিন। আমার অর্থ আমি Regex.Splitপাইথনের প্রয়োগের চেয়ে অনুরূপ সিনট্যাক্স পেতে ব্যবহার করতে পারি তবে সাধারণ কোনও কিছুর জন্য কম পারফরম্যান্স (সেটআপ সময়) ব্যয় করে আমাকে এটি করতে হবে ।

সুতরাং মূলত, আমার প্রশ্ন হ'ল কেন আমরা ঠিক করতে পারি না:

testString.Split("anotherString");

মনে রাখবেন যে আমি কোনও প্রোটোটাইপ বা বাস্তবায়ন করার পরামর্শ দিচ্ছি না। আমি বুঝেছি আপনি কেন বর্তমান এপিআই বিবেচনা করে উপরের সংস্করণটি প্রয়োগ করতে পারেন নি। আমার লক্ষ্য ছিল উপরোক্ত সিনট্যাক্সটি যে উপকারটি নিয়ে আসে সে বিবেচনা করে কেন এমন একটি এপিআই তৈরি করা যেতে পারে। আপাতত, নমনীয়তা বর্তমানের লক্ষ্য বলে মনে হয় String.Splitযা বোধগম্য হয় তবে সত্য বলতে সত্যই আমি ভেবেছিলাম যে কোথাও কোথাও একরকম পারফরম্যান্স লাভ রয়েছে। আমার ধারণা আমি ভুল ছিলাম।


3
আমি এই সম্পর্কে চিন্তা ছিল। আমার অনুমান এই যে তারা এই একটি এপিআই ডিজাইনে খুব বেশি প্রচেষ্টা করেনি। এবং যদি তারা তাদের ভুল বুঝতে পারে তবে অনেক দেরি হয়ে গেছে।
ইউফোরিক

@ ক্যালথ আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন? হতে পারে আমি ভুল কিন্তু এটি সম্পর্কে কি চমকপ্রদ আমি দেখতে পাচ্ছি না। কেন আমি করতে পারি না testString.Split(",.;");এবং testString.Split(new Char [] {',', '.', ';',);যা একই জিনিস নয়।
scharette

@ ইউফোরিক আমিও খুব চেষ্টা করেছিলাম, তবে তা এতটা অদ্ভুত হবে। আশা করি কেউ আরও যুক্তিযুক্ত উত্তর নিয়ে আসে।
scharette

আপনি যেমন স্ট্রিং দিয়ে পুনরাবৃত্তি করতে পারেন ঠিক তেমন IEnumerable<char>অতিরিক্ত প্রোটোটাইপটি আপনি প্রস্তাব দিচ্ছেন কিছু ক্ষেত্রে অস্পষ্ট দেখা যেতে পারে (আপনি কি পুরো স্ট্রিং দিয়ে বিস্মৃত করেন বা এর প্রতিটি অক্ষর দিয়েই সীমান্তে রেখেছেন?) মাত্র একটি অনুমান।
জন উ

@ জোহানউইউ সম্ভবত এটি একটি ব্যক্তিগত জিনিস, তবে সিনট্যাক্সের মতো 99.9% ঘটনার জন্য testString.Split("anotherString");আমি এই কথাটি বলতে বেশ আত্মবিশ্বাসী যে প্রত্যাশিত আচরণটি পুরো স্ট্রিংয়ে ( anotherStringএই ক্ষেত্রে) সীমাবদ্ধ করা উচিত ছিল ।
scharette

উত্তর:


15

কখনও কখনও একাধিক চর / স্ট্রিংয়ের উপর বিভাজন কার্যকর হয়, তাই আপনাকে সর্বোচ্চ নমনীয়তা দিয়ে এপিআই আপনাকে একটি অ্যারে সরবরাহ করতে দেয়। এর ক্ষেত্রে char, আপনি বাক্য গঠন এবং নমনীয়তা উভয়ই পান যেহেতু প্যারামিটারটি চিহ্নিত করা হয়েছে যার পরিবর্তে paramsআপনি লিখতে পারেন ।Split('x')Split(new[]{'x'})

তাহলে স্ট্রিংগুলির জন্য কেন অনুরূপ বিকল্প নেই, আপনাকে লেখার অনুমতি দিচ্ছে Split("x")?

এটি সম্ভবত কীভাবে এপিআই ডিজাইন করা হয়েছে তার দুর্ভাগ্যজনক পরিণতি। প্রথমদিকে এটি কেবল চরগুলিতে বিভক্ত হওয়ার অনুমতি দেয়। স্ট্রিংগুলিতে বিভক্তকরণ 2.0 তে যুক্ত হয়েছিল, সম্ভবত এটি কার্যকর করা আরও জটিল is তবে এটি যুক্ত করা String.Split(string)বা String.Split(string[])অতিরিক্ত লোড করা সম্ভব ছিল না , যেহেতু এটি অভিব্যক্তিটিকে testString.Split(null)দ্বিধাগ্রস্থ করে তুলবে এবং এই কোডটি আর সংকলন করবে না।

testString.Split(null) এটি প্রকৃতপক্ষে একটি সাধারণ প্রচলিত আইডিয়োম যেহেতু এটি হোয়াইটস্পেসে স্ট্রিং বিভক্ত হয়, সুতরাং এই জাতীয় ভাঙ্গন গ্রহণযোগ্য হতে পারে না widespread

nullবিশেষ আচরণের জন্য একটি স্যুইচ হিসাবে একটি- পরিমিতি ব্যবহার করা সাধারণত এই দিনগুলিকে খারাপ ডিজাইন হিসাবে বিবেচনা করা হয়, তাই আমি এই এপিআইটি কেবল ত্রুটিযুক্ত বলা ঠিক হবে বলে মনে করি।

কোন নেই Split(string[], Int32), হয় সম্ভবত একটি অনুরূপ কারণে - এটা সাথে অস্পষ্ট হবে Split(char[], Int32)যদি প্রথম প্যারামিটার null। সেখানে হয় সঙ্গে অনুরূপ overloads StringSplitOptionsপরামিতি, কিন্তু এই সব, 2.0 একই সময়ে যোগ করা হয় নি তাই কোন অস্পষ্টতা বিদ্যমান কোডে চালু করা হয়।

বিঃদ্রঃ

পরিষ্কার করে বলতে গেলে এটি কেবল আমার অনুমান, আমি নেট নেট ফ্রেমওয়ার্ক ডিজাইনারদের দ্বারা আসল চিন্তাভাবনা জানি না।


1
আচ্ছা, এটা কি আদৌ কার্যকর? সন্দেহ আছে। এবং এটি কেবলমাত্র একটি এআইপি-ব্রেক, কোনও এবিআই নয়।
Deduplicator

2
@ প্রতিলিপি: সাদা স্পেসে স্প্লিট (নাল) বিভক্ত হয়, সুতরাং এটি সম্ভবত বিভাজনের জন্য সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে এটি, যদিও এটির মতো নাল ব্যবহার করা খারাপ এপিআই ডিজাইন।
জ্যাকবিবি

1
আমি মনে করি @ ডেডুপ্লিকেটর বলতে চাইলে এটি নিষ্ক্রিয় Split(null)যদি আপনি অনুমতি দেন Split("")। এটি কোনও উপায়ে আরও ভাল সিনট্যাক্সের অনুমতি দেবে তা ছাড়াও পরবর্তীটি যেকোনভাবে আরও
ভার্জোজ

1
@ শ্যারেট: অবশ্যই, তবে পশ্চাদপদ সামঞ্জস্যতা না ভেঙে এখনই পরিবর্তন করা সম্ভব নয়।
জ্যাকসবি

1
একটি নোট: বর্তমান সি # 8 পূর্বরূপের সাথে, বেস প্রকারের শূন্যতাটি বন্ধ করে দিয়ে String.Split(null)দ্বিধাগ্রস্থতা আর স্পষ্ট হবে না, যাতে তারা
ওভারলোডটি

2

পদ্ধতিগুলির লেখক না হয়ে, কেন জানি ওভারলোডের সেটটি বেছে নেওয়া হয়নি। তবে এখানে দুটি বিষয় লক্ষণীয়:

  1. আপনি যদি একটি একক চরিত্রের উপর বিভক্ত হন, তবে public string[] Split(params char[] separator) সংস্করণটি এভাবে ব্যবহার করা যেতে পারে:

    var splitValues = testString.Split(',');

    যেমন char[]একটি হল paramsপ্যারামিটার।

  2. আপনি যা চান তা অর্জন করতে আপনি এখানে সহজেই নিজের সম্প্রসারণ পদ্ধতি যুক্ত করতে পারেন:

    public static class StringExtensions
    {
        public static string[] Split(this string source, string separator)
            => source.Split(new string[] { separator }, StringSplitOptions.None);
    }
    

    এবং এখন testString.Split("anotherString");আপনার জন্য কাজ করবে।


1
সাহায্য করার জন্য ধন্যবাদ. যদিও আপনার উত্তর সহায়ক এবং সংক্ষিপ্ত, আমি আপনার সাথে একমত হতে পারি না। বিশেষত দ্বিতীয় বিষয়। এটি বিল্ট-ইন করার আরও একটি কারণ কি নয়? এটি সমস্ত কিছু সম্প্রদায়কে এমন একটি পদ্ধতির বিভিন্ন সংস্করণ তৈরি করতে দেয় যা প্রত্যেকে (বা প্রায় প্রত্যেকে) একইভাবে আচরণ করার প্রত্যাশা করে।
scharette

উপায় দ্বারা বিতর্ক করার চেষ্টা না করে, আপনার পয়েন্টটি পুরোপুরি বৈধ। কেবল এর পিছনে কারণটি বোঝার চেষ্টা করছি।
যৌক্তিকভাবে

@ শ্যাচারেট: কারণটি হ'ল পদ্ধতিটি যতটা সম্ভব সাধারণ উদ্দেশ্য হিসাবে তৈরি করা। আপনি আপনার নির্বাচিত পদ্ধতির স্বাক্ষরটি হিসাবে যতটা পছন্দনীয়, এটি একাধিক ডিলিমিটারের পক্ষে কাজ করবে না। মাইক্রোসফ্ট এর সংস্করণ আপনার একক ডিলিমিটারের পাশাপাশি একাধিক ডিলিমিটারের জন্যও কাজ করবে।
রবার্ট হার্ভে

নিবন্ধন করুন আসুন ধরা যাক উপরের উত্তরে এক্সটেনশন পদ্ধতিটি Stringশ্রেণীর অংশ ছিল , উভয়ই সম্ভব হবে। আমি কি ভূল ?
scharette

আমি মনে করি আপনি পয়েন্টটি মিস করছেন। আপনার ওভারলোড কেবলমাত্র একটি ডিলিমিটারের অনুমতি দেয়। মাইক্রোসফ্ট এর ওভারলোড একের বেশি অনুমতি দেয়। আপনি আপনার ওভারলোডকে একাধিকবার কল করতে এবং একই ফলাফল অর্জন করতে পারবেন না; এটি এইভাবে কাজ করে না।
রবার্ট হার্ভে

1

বিভিন্ন ভাষায় অন্তর্নিহিত রূপান্তর এবং ওভারলোডিংয়ের জন্য কিছুটা আলাদা বিধি রয়েছে এবং। নেট ফ্রেমওয়ার্ক এর যে কোনও একটির সাথে ব্যবহারযোগ্য হওয়ার জন্য তৈরি করা হয়েছে। Option Strict OffVB.NET এর উপভাষায়, টাইপের মান Stringএকটি ফাংশনে প্রেরণ করা যেতে পারে যা স্ট্রিংয়ের Char[]দিকে কল ToCharArray()করার সমতুল্য আচরণের সাথে প্রত্যাশা করে।

আমি মনে করি না যুক্তিসম্মত জিনিসের জন্য পৃথক নাম ধারণ করে হত Split(যা একটি একক গ্রহণ Charবা Stringএবং) SplitMulti(যা একটি মেনে নেবেন Char[]বা String[]), কিন্তু .NET কখনও কখনও একা ওভারলোডিং অপারেশনের বিভিন্ন ধরণের বাছাই ব্যবহার পক্ষপাতী বলে মনে হয়। দুর্ভাগ্যবশত, আমি ব্যবহার করতে কোন উপায় জানা String.Splitযেকোনো ব্যবহারের পরিস্থিতিতে প্রতিটি উপর আলাদাভাবে বিভাজন দ্বারা ব্যতীত অন্য বিভেদক বিভিন্ন ধরণের পার্থক্য করতে হবে মিটমাট করতে।

পূর্ববর্তী স্ট্রিংয়ের শেষে, বা নিম্নলিখিত স্ট্রিংয়ের শুরুতে, বা বিজোড়-সংখ্যাযুক্ত অ্যারে উপাদানগুলি বিভাজক হতে পারে এমনকী, এমনকি সম-সংখ্যাযুক্ত উপাদানগুলির মধ্যে জিনিসগুলি হ'ল অপরটি বাদ দেওয়া im


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