স্ট্রিং.এম্পটির মতো কোনও চর নেই কেন?


259

এরজন্য কি কোন কারণ আছে? আমি জিজ্ঞাসা করছি কারণ আপনার যদি প্রচুর খালি অক্ষর ব্যবহারের প্রয়োজন হয় তবে আপনি প্রচুর খালি স্ট্রিং ব্যবহার করার সময় আপনি একই পরিস্থিতিতে পড়বেন।

সম্পাদনা: এই ব্যবহারের কারণটি ছিল:

myString.Replace ('c', '')

সুতরাং মাই স্ট্রিং থেকে 'সি এর সমস্ত দৃষ্টান্ত সরান।


1
হ্যাঁ আমি আরও ভাল শব্দটির অভাবের জন্য এই শব্দটি ব্যবহার করেছি used অর্থাত্ স্ট্রিং ব্যবহারের প্রস্তাবিত উপায় mp
জোয়ান ওয়েঙ্গেজ

3
যদি আপনি কখনও কখনও দুর্ঘটনাক্রমে ভুল 'টাইপিং' সম্পর্কে উদ্বিগ্ন হন তবে কেন কেবল কেবল একটি লাইনের সাথে বর্ধন পদ্ধতিতে কার্যকারিতাটি গুটিয়ে রাখবেন নাRemoveAll(this string s, params char[] toRemove) ? অভিপ্রায়টি স্পষ্টভাবে জানানো হবে এবং আপনি কোনও কিছুতে ভুল টাইপ করার ঝুঁকি নেবেন না।
bzlm

12
@ হেনক - আমি স্ট্রিংটি ব্যবহার করার একমাত্র কারণ mp খালি উদ্ধৃতিগুলির চেয়ে খালি উদ্ধৃত ইন্টিটিটি ভালভাবে সরবরাহ করা নাল বস্তুটি অভিপ্রায়টিকে আরও ভাল বলে মনে করি। খালি উদ্ধৃতিগুলি কোনও মার্জ সমস্যা, বা গণ্ডগোলিত চিন্তাধারার ফলে হতে পারে বা এটি সেই কোডের আসল অভিপ্রায় হতে পারে, যেখানে খালি স্পষ্টভাবে আমাকে বলে যে ডেভলপাররা সেই স্ট্রিংটির ডেটা না রাখার উদ্দেশ্যে নিয়েছিল।
রিচ মেল্টন

3
"" এবং স্ট্রিংয়ের মধ্যে একটি পার্থক্য রয়েছে mp যে কেউ যত্ন করে না, সত্যই, তবে "" একটি বস্তু তৈরি করে, যেখানে স্ট্রিং। এমপিটি ইতিমধ্যে তৈরির ব্যবহার করে। কিন্তু আবার, এটা এত ছোট হয়, যে শুধুমাত্র বিশেষ পরিস্থিতিতে এটা একটা থাকল করতে হবে
মার্সেলো-Ferraz

1
@ মার্সেলো-ফেরাজম, ""একটি বিষয় তৈরি করে : না, তা করে না।
হেন্ক হলটারম্যান

উত্তর:


271

খালি চর হিসাবে তেমন কোনও জিনিস নেই। আপনি যে নিকটতমটি পেতে পারেন তা হ'ল '\0', ইউনিকোড "নাল" অক্ষর। আপনি স্ট্রিং আক্ষরিক মধ্যে এম্বেড করতে পারেন বা এটি খুব সহজেই এটি প্রকাশ করতে পারেন তবে আপনি কেন এটির জন্য আলাদা ক্ষেত্র চান? একইভাবে, "এটি বিভ্রান্ত করা সহজ ""এবং " "" যুক্তিগুলির জন্য প্রযোজ্য না'\0'

আপনি কোথায় এটি ব্যবহার করতে চান এবং কেন এটি আরও ভাল হবে বলে আপনি যদি একটি উদাহরণ দিতে পারেন তবে এটি সহায়তা করতে পারে ...


2
\ 0 কি 'বাইট অ্যারে'-চরিত্রের শেষ নয়? নাকি আমি অন্য কিছু নিয়ে বিভ্রান্ত করছি?
বার্টওয়ান

5
@ বার্টওয়ান: বাইট অ্যারের শেষে কেন একটি চরিত্র থাকবে ? হ্যাঁ, এটি "নাল টার্মিনেটেড" স্ট্রিংয়ের জন্য ব্যবহৃত হয়।
জন স্কিটি

35
Char.MinValue '\ 0' এর চেয়ে ভাল
Aliostad

10
@ আলিওস্টাড: আগ্রহের বাইরে, যদি এখানে একই রকম ক্ষেত্র ছিল Int32.Zero, আপনি কি আক্ষরিক 0 এর পরিবর্তে এটি ব্যবহার করবেন? তা না হলে এখানে পার্থক্য কী?
জন স্কিটি

7
@ অ্যাডাম, @ জন - বেলের কোড কী? বা ব্যাকস্পেস আরও ভাল, চিন্তা করুন ... বা ভাবার পরিবর্তে চর.ব্যাকস্পেস লেখার চেয়ে আরও ভাল? আরেকটি কারণ - আপনি বলেছিলেন যে টার্মিনেটরের জন্য '0' লেখাই ভাল, পরিবর্তে, Char.Terminator বলুন, তবে এটি নয় - একটি টাইপও করা সম্পূর্ণ সহজ (সম্পূর্ণ সংকলিত, উপরে দেখুন), তবে লেখার চেষ্টা করুন Char.Termnator। আমার অ-চেকযোগ্য, কাঁচা মানগুলি এড়াতে পর্যাপ্ত কারণ রয়েছে (স্পেস মিশনগুলি এর মতো বোকা টাইপের কারণে ব্যর্থ হয়েছিল)।
গ্রীনোল্ডম্যান

87

একটি চর, একটি স্ট্রিংয়ের বিপরীতে, একটি নির্দিষ্ট আকারের একটি বিযুক্ত জিনিস। একটি স্ট্রিং সত্যই অক্ষরের ধারক।

সুতরাং, Char.Empty সত্যিই সেই প্রসঙ্গে বোঝায় না। আপনার যদি চর থাকে তবে এটি খালি নয়।


3
ঠিক তাই. কোনও ধারক খালি আছে কিনা তা জিজ্ঞাসা করে বোঝা যায়। কোনও অন্তর্নিহিত বা ভাসা ভাসা জিজ্ঞাসা করা বা চরটি ফাঁকা থাকার কোনও মানে নেই।
টেড

1
@ জো: তারপরে স্ট্রিং কীভাবে খালি থাকতে পারে (খালি নয়) অক্ষরের সংকলন? সম্ভবত নির্বোধ, দুঃখিত ...
ব্যবহারকারী 1477388

9
কারণ একটি স্ট্রিং পৃথক বস্তু নয়, এটি সংগ্রহ। এক বালতি শিলার কথা ভাবুন। আমার খালি শিলা নেই। তবে আমার কাছে খালি বালতি থাকতে পারে।
জো

2
আমি এটিকে "চারকটি আদিম, মানের ধরণ এবং একটি স্ট্রিং অ-আদিম, রেফারেন্স টাইপ" হিসাবে অভিহিত করব।
সামিস ২

3
এটিই আসল উত্তর।
গ্যান্ডালফ 458

31

খালি চরিত্রের কোনও জিনিস নেই। এটি সর্বদা কিছু না কিছু থাকে । এমনকি '\ 0' একটি চরিত্র।


28

Char.MinValue'\ 0' এর মতো কাজ করে এমনটি ব্যবহার করুন । তবে সাবধান থাকুন এটি এর মতো নয় String.Empty


ধন্যবাদ, এর আগে দেখিনি। আপনি কি জানেন যে এটি মাই স্ট্রিংয়ে কাজ করে? প্রতিস্থাপন ('সি', চর.মিনভ্যালু)? আমার এটি করা উচিত।
জোয়ান ওয়েঙ্গেজ


12

আপনার যদি পুরো স্ট্রিংয়ের প্রয়োজন না হয় তবে আপনি বিলম্বিত কার্যকর হওয়ার সুবিধা নিতে পারেন:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}

আপনি একাধিক অক্ষর একত্রিত করতে পারেন ...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... এবং শুধুমাত্র প্রথম 7 টি অক্ষর মূল্যায়ন করা হবে :)

সম্পাদনা: বা, আরও ভাল:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}

এবং এর ব্যবহার:

        var veryLongText = "abcdefghijk...";
        IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChars('c', 'd')
            .Take(5)
            .ToArray(); //to prevent multiple execution of "RemoveChars"

@ জোয়ান: ধন্যবাদ ... "জেনিয়াস" হলেও এটি কিছুটা অতিরঞ্জিত: পি (আমি যখন তার চরিত্রগুলি সম্পর্কে জানতে পারি না যখন চারাগুলি অপসারণ করা একটি বড় অ্যারে হয়ে উঠবে ...)
কুখ্যাত ১৯

1
গতকাল আমি ভুলে গেছি: আপনি কীভাবে ফলাফল পরিবর্তনশীল "firstFiveCharsWithoutCsAndDs" ব্যবহার করছেন সেদিকে মনোযোগ দিন। আপনি যদি এটি অন্য একটি "ফলন" পদ্ধতিতে (লিনকির মতো) পাস করতে না চান, তবে "টেক (5)" এর পরে অবিলম্বে একটি ".ToArray ()" কল করুন ... অন্যথায়, "সরানChars + নিন" যখন আপনি "traditionalতিহ্যবাহী" ফ্যাশনে ভেরিয়েবল অ্যাক্সেস করবেন তখন চেইন কার্যকর করা হবে (উদাহরণস্বরূপ, আপনি প্রত্যেকে এর উপরে "গণনা ()" বলছেন বা আপনি যখন "ফলন ফেরত" ছাড়াই কোনও পূর্বে অগ্রণী হন)
notoriousxl

+1 সুন্দর চিন্তা। তবে এটি বেসিক পদ্ধতির মতো রক্ষণাবেক্ষণযোগ্য বা দক্ষতা অর্জন করতে পারে না :)
নওফাল

1
@ নফলাল দক্ষতা অনুসারে আপনি ঠিক বলেছেন তবে আমি মনে করি যে myString.Excep ("c") মাই স্ট্রিংয়ের চেয়ে বেশি ঘোষিত ep "আইইউইউ"))
কুখ্যাত

7
myString = myString.Replace('c'.ToString(), "");

ঠিক আছে, অক্ষরগুলি অপসারণের জন্য এটি বিশেষভাবে মার্জিত নয়, কারণ প্রতিস্থাপন পদ্ধতির একটি ওভারলোড রয়েছে যা স্ট্রিং পরামিতি নেয় takes তবে এটি ক্যারেজ রিটার্ন, লাইন ফিডস, ট্যাব ইত্যাদি মুছে ফেলার জন্য কাজ করে This উদাহরণটি ট্যাব অক্ষরগুলি সরিয়ে দেয়:

myString = myString.Replace('\t'.ToString(), "");

6

একই কারণ নেই int.Empty। ধারকগুলি খালি থাকতে পারে। স্কেলারের মান হতে পারে না। যদি আপনার 0 টি বোঝায় (যা খালি নয়) তবে ব্যবহার করুন '\0'। যদি আপনি বোঝাতে চান null, তবে ব্যবহার করুন null:)


2
চরটি একটি মান টাইপ হওয়ায় নাল সম্ভব নয়। আপনি চর ব্যবহার করতে চান? এটি নাল বরাদ্দ করতে সক্ষম হতে।
Femaref

আপনি এটিকে শালীন করে তুলবেন। আমার উত্তরটি দেখুন
paquetp

5

একটি চর একটি মান প্রকার, সুতরাং এর মান শূন্য হতে পারে না। (যতক্ষণ না এটি একটি নল পাত্রে আবৃত না হয়)।

যেহেতু এটি নাল হতে পারে না, তাই কিছু সংখ্যক কোড থাকে এবং প্রতিটি কোড কোনও না কোনও অক্ষরে ম্যাপ করা হয়।


4

আপনার প্রশ্নের উত্তর নয়, তবে একটি ডিফল্ট বোঝাতে charআপনি স্রেফ ব্যবহার করতে পারেন

default(char)

যা একই হিসাবে char.MinValueযেটা ঘুরে ফিরে হিসাবে একই \0। যদিও খালি স্ট্রিংয়ের মতো কোনও কিছুর জন্য ব্যবহার করা উচিত নয়।


1

আপনার প্রথম প্রশ্নের উত্তর দেয় না - তবে আপনার যে নির্দিষ্ট সমস্যাটি ছিল তার জন্য আপনি কেবল অক্ষরের পরিবর্তে স্ট্রিং ব্যবহার করতে পারেন, তাই না ?:

myString.Replace("c", "")

একটি কারণ আপনি এটি করতে চান না?


1

আপনি নিজের স্ট্রিং চরিত্রটিকে চরিত্র অনুসারে পুনর্নির্মাণ করতে পারেন, যে অক্ষরগুলি থেকে মুক্তি পেতে চান তা বাদ দিয়ে।

এটি করার জন্য এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে:

    static public string RemoveAny(this string s, string charsToRemove)
    {
        var result = "";
        foreach (var c in s)
            if (charsToRemove.Contains(c))
                continue;
            else
                result += c;

        return result;
    }

এটি চতুর বা অভিনব নয়, তবে এটি ভালভাবে কাজ করে।

এটি ব্যবহার করুন:

string newString = "My_String".RemoveAny("_"); //yields "MyString"

একটি StringBuilderব্যবহার করুন result। কেন জড়িয়ে নেই return s.Replace(charsToRemove,"");?
aodisdg চলন্ত codidact.com

1

আপনি যদি কোনও নির্দিষ্ট শর্তটি পূরণ করে এমন অক্ষরগুলি সরাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

string s = "SoMEthInG";
s = new string(s.Where(c => char.IsUpper(c)).ToArray());

(এটি স্ট্রিংয়ে কেবল বড় হাতের অক্ষর ছেড়ে দেবে।)

অন্য কথায়, আপনি স্ট্রিংটিকে "হিসাবে" ব্যবহার করতে পারেন IEnumerable<char> , তার উপর পরিবর্তন করতে পারেন এবং তারপরে উপরের চিত্রের মতো এটি স্ট্রিংয়ে ফিরে রূপান্তর করতে পারেন।

আবার, এই, যদিও আপনি তা করতে পারেন যদি আপনি ভালো ল্যামডা অভিব্যক্তি পরিবর্তন না শুধুমাত্র ল্যামডা মত প্রকাশের কারণ একটি নির্দিষ্ট গৃহস্থালির কাজ অপসারণ করতে সক্ষম হবেন: c => c != 't'


0

বিওএম সম্পর্কে কীভাবে , মাইক্রোসফ্টের যাদুকর চরিত্র ফাইলগুলি শুরু করতে অন্তত: এক্সএমএল যোগ করে?


এখানে উইকিপিডিয়ায় শব্দটি বেশ দুর্ভাগ্যজনক; বিওএম এই প্রসঙ্গে কোনও চরিত্র নয়। এবং আপনার প্রশ্নটি ঠিক কী? :)
bzlm

@ একম্যাচ, সুতরাং, myString.Replace ('c', '')এটি অর্জন করা যায় কিনা myString.Replace ('c', UTF_BOM)। তারপরে আমি বলব উত্তরটি "কীভাবে নয় ..."।
bzlm

0

আপনি যদি খালি চরটিকে স্ট্রিংয়ে ইলিমিনেট করতে চান তবে নীচেরগুলি কাজ করবে, কেবল আপনার যে কোনও ডেটাটাইপ উপস্থাপনায় রূপান্তর করুন। ধন্যবাদ,

private void button1_Click(object sender, EventArgs e)
    {

        Int32 i;

        String name;

        Int32[] array_number = new int[100];

        name = "1 3  5  17   8    9    6";

        name = name.Replace(' ', 'x');

        char[] chr = name.ToCharArray();


        for (i = 0; i < name.Length; i++)
        {
            if ((chr[i] != 'x'))
            {
                array_number[i] = Convert.ToInt32(chr[i].ToString());
                MessageBox.Show(array_number[i].ToString());
            }

        }

    }

0

সি # ভাষার ক্ষেত্রে, নিম্নলিখিতগুলি খুব বেশি অর্থবোধ করে না। এবং এটি প্রশ্নের সরাসরি উত্তর নয়। তবে ফাউলওলিং হ'ল আমি আমার ব্যবসায়ের একটি দৃশ্যে

        char? myCharFromUI = Convert.ToChar(" ");
        string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
        if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
        {
            Console.Write("Success");
        }

nullএবং white spaceছিল অন্য কোনো ব্যবসা আমার প্রকল্পে বয়ে চলে। ডাটাবেসে tingোকানোর সময়, আমার empty stringযদি ডাটাবেসটি সাদা স্থান হয় তবে সন্নিবেশ করা দরকার ।


0

আমি জানি এটি বেশ পুরানো, তবে একটি ফাইলের নামটি সুরক্ষিত করতে একাধিক প্রতিস্থাপন করার পরে আমি সম্প্রতি একটি সমস্যার মুখোমুখি হয়েছি। প্রথমত, সর্বশেষ .NET স্ট্রিং-এ প্রতিস্থাপন ফাংশন নাল খালি অক্ষরের সমতুল্য। যা বলার পরে, যা অনুপস্থিত তা। নেট হ'ল একটি সরল প্রতিস্থাপন যা কোনও অ্যারে কোনও চরিত্রকে পছন্দসই চরিত্রের সাথে প্রতিস্থাপন করবে। দয়া করে নীচের কোডটি নির্দ্বিধায় নির্দ্বিধায় (পরীক্ষার জন্য লিনকপ্যাডে চালিত হয়)।

// LinqPad .ReplaceAll and SafeFileName
void Main()
{

    ("a:B:C").Replace(":", "_").Dump();                     // can only replace 1 character for one character => a_B_C
    ("a:B:C").Replace(":", null).Dump();                    // null replaces with empty => aBC
    ("a:B*C").Replace(":", null).Replace("*",null).Dump();  // Have to chain for multiples 

    // Need a ReplaceAll, so I don't have to chain calls


    ("abc/123.txt").SafeFileName().Dump();
    ("abc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName('_').Dump();
    //("abc/123").SafeFileName(':').Dump(); // Throws exception as expected

}


static class StringExtensions
{

    public static string SafeFileName(this string value, char? replacement = null)
    {
        return value.ReplaceAll(replacement, ':','*','?','"','<','>', '|', '/', '\\');
    }

    public static string ReplaceAll(this string value, char? replacement, params char[] charsToGo){

        if(replacement.HasValue == false){
                return string.Join("", value.AsEnumerable().Where(x => charsToGo.Contains(x) == false));
        }
        else{

            if(charsToGo.Contains(replacement.Value)){
                throw new ArgumentException(string.Format("Replacement '{0}' is invalid.  ", replacement), "replacement");
            }

            return string.Join("", value.AsEnumerable().Select(x => charsToGo.Contains(x) == true ? replacement : x));
        }

    }

}


-3

কম্বলটি স্ট্রিং থেকে সরানোর সহজ উপায়টি এটি ছাঁটাই করা

cl = cl.Trim(' ');

একটি স্ট্রিংয়ের সমস্ত ফাঁকা স্থান সরিয়ে দেয়


যদি কেউ ব্যবহার করতে চান তবে এটি সহায়ক। তবে দেওয়া অন্যান্য উত্তরগুলির তুলনায় এটি আরও সহায়ক।
জানুয়ারী

1
না এটা ভুল!
ছাঁটাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.