আপনি একটি স্ট্রিংয়ের মধ্যে একটি স্ট্রিংয়ের ঘটনা (আসলে একটি চর) কীভাবে গণনা করবেন?


863

আমি এমন কিছু করছি যেখানে আমি বুঝতে পেরেছিলাম যে আমি /স্ট্রিংয়ের মধ্যে কতগুলি খুঁজে পেতে পারি তা গণনা করতে চেয়েছিলাম এবং এটি আমাকে আঘাত করেছিল যে এটি করার বিভিন্ন উপায় ছিল তবে সেরা (বা সবচেয়ে সহজ) কোনটি ছিল তা নিয়ে সিদ্ধান্ত নিতে পারিনি ।

এই মুহুর্তে আমি এমন কিছু নিয়ে যাচ্ছি:

string source = "/once/upon/a/time/";
int count = source.Length - source.Replace("/", "").Length;

তবে আমি মোটেও পছন্দ করি না, কোনও গ্রহণকারী?

আমি সত্যিই এটির জন্য খনন RegExকরতে চাই না, তাই না?

আমি জানি যে আমার স্ট্রিংটিতে আমি যে শব্দটি অনুসন্ধান করছি তা থাকবে, যাতে আপনি ধরে নিতে পারেন ...

অবশ্যই স্ট্রিংগুলির জন্য যেখানে দৈর্ঘ্য> 1 ,

string haystack = "/once/upon/a/time";
string needle = "/";
int needleCount = ( haystack.Length - haystack.Replace(needle,"").Length ) / needle.Length;

34
+1: আমার অবশ্যই বলতে হবে এটি গণনা করার একটি খুব আলাদা উপায়। আমি বেঞ্চ চিহ্ন পরীক্ষার ফলাফলগুলিতে অবাক হয়েছি :)
নবীন

4
এটি তাই বিভিন্ন নয় ... এটা SQL এর যে এই কার্যকারিতা বাস্তবায়ন টিপিক্যাল উপায় আছে: LEN(ColumnToCheck) - LEN(REPLACE(ColumnToCheck,"N",""))
শেরিডান

6
প্রকৃতপক্ষে আপনার "/" দ্বারা ভাগ করা উচিত en লেন্থ
জেরার্ড

3
আমি জিজ্ঞাসা করতে পারি, আপনার প্রয়োজনীয়তাগুলি কী বলে যে "/////" এর মধ্যে "//" এর সংখ্যার জন্য গণনা হওয়া উচিত? 2 বা 4?
লেস

1
রিজেেক্স ব্যবহার করা সম্ভবত এটির সবচেয়ে ভাল উপায়
অ্যাডাম হিগিন্স

উত্তর:


1008

যদি আপনি .NET 3.5 ব্যবহার করে থাকেন তবে আপনি এটি লিনকিউ সহ ওয়ান-লাইনারে করতে পারেন:

int count = source.Count(f => f == '/');

আপনি যদি লিনকিউ ব্যবহার করতে না চান তবে আপনি এটি দিয়ে করতে পারেন:

int count = source.Split('/').Length - 1;

আপনি জানতে পেরে অবাক হতে পারেন যে আপনার আসল কৌশলটি যে কোনওটির থেকে প্রায় 30% দ্রুত বলে মনে হচ্ছে! আমি স্রেফ "/ একবার / উপর / এক / সময় /" দিয়ে একটি দ্রুত বেঞ্চমার্ক করেছি এবং ফলাফলগুলি নিম্নরূপ:

আপনার আসল = 12s
source.Count = 19s
source.Split = 17s
foreach ( bobwienholt এর উত্তর থেকে ) = 10s

(সময়গুলি 50,000,000 পুনরাবৃত্তির জন্য যাতে আপনি বাস্তব বিশ্বে খুব বেশি পার্থক্য লক্ষ্য করতে পারেন না))


6
হ্যাঁ, ভিএস স্ট্রিং ক্লাসে লিনিকউ এক্সটেনশন পদ্ধতিগুলি লুকায়। আমি অনুমান করি তারা অনুমান করেছে যে ডিভসগুলি এই সমস্ত বর্ধিত পদ্ধতিগুলি স্ট্রিং ক্লাসে প্রদর্শিত হবে না। সম্ভবত একটি বুদ্ধিমান সিদ্ধান্ত।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

11
এই আচরণটি সম্ভব কারণ VS2010 স্বয়ংক্রিয়ভাবে নতুন ক্লাস ফাইলগুলিতে System.Linq অন্তর্ভুক্ত করে, VS2008 সম্ভবত তা করে না। ইন্টেলিসেন্স কাজ করার জন্য নেমস্পেস থাকা দরকার।
স্প্রেগ করুন

30
নোট করুন যে গণনা এবং বিভক্ত সমাধানগুলি কেবল তখনই কাজ করবে যখন আপনি অক্ষর গণনা করছেন। ওপি'র সমাধানের মতো তারা স্ট্রিং নিয়ে কাজ করবে না।
পিটার লিলভল্ড

5
f == '\' টর্মে স্ট্রিং নয়, একটি স্ট্রিংয়ের অক্ষর সম্পর্কে
থমাস ওয়েলারের

9
এটি অন্য প্রশ্নের উত্তরের মতো বলে মনে হচ্ছে: "আপনি কোনও স্ট্রিংয়ের মধ্যে চরের উপস্থিতিগুলি কীভাবে গণনা করবেন?"
বেন অ্যারনসন

181
string source = "/once/upon/a/time/";
int count = 0;
foreach (char c in source) 
  if (c == '/') count++;

source.Replace()নিজে থেকে দ্রুত হতে হবে ।


18
আপনি পূর্বাভাসের পরিবর্তে এর জন্য স্যুইচিংয়ের মাধ্যমে প্রান্তিক উন্নতি অর্জন করতে পারেন, তবে কেবল একটি ক্ষুদ্র, সামান্য বিট।
চিহ্নিত

17
না। প্রশ্নটি স্ট্রিংয়ের উপস্থিতি গণনা করতে বলেছে, চরিত্র নয়।
YukiSakura

3
এটি একটি স্ট্রিংয়ে অক্ষর গণনা করা হচ্ছে। শিরোনামটি একটি স্ট্রিংয়ের স্ট্রিংগুলি গণনা সম্পর্কে
থমাস ওয়েলার

2
@ মার্ক এটি লুপের জন্য সবেমাত্র এটি পরীক্ষা করেছেন এবং এটি ফোরচ ব্যবহারের চেয়ে আসলে ধীর ছিল। সীমানা-চেকিংয়ের কারণে হতে পারে? (5 মিলিয়ন পুনরাবৃত্তির সময় সময় 1.65 সেকেন্ড বনাম 2.05 ছিল))
পরিমাপ করা

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

136
int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;

8
+1 - কিছু ক্ষেত্রে আপনি যুক্ত করতে চাইতে পারেন RegexOptions.IgnoreCase
ট্রুউইল

3
এটি কি অবিশ্বাস্যভাবে কম নয়?
টমাস আইয়ুব

4
রেজেক্স ওভারহেড আদর্শ নয়, এবং "আমি সত্যই এর জন্য RegEx খনন করতে চাই না, তাই না?"
চাদ

না চাইতে পারেন Regex.Escape(...), যাতেnew System.Text.RegularExpressions.Regex(needle).Matches(haystack).Count;
barlop

2
আমি এটির সাথে গিয়েছিলাম কারণ এটি কেবল অক্ষর নয়, স্ট্রিংগুলি অনুসন্ধান করতে পারে।
জেমস ইনডি

86

আপনি যদি কেবল অক্ষর না থেকে পুরো স্ট্রিংগুলি অনুসন্ধান করতে সক্ষম হতে চান:

src.Select((c, i) => src.Substring(i))
    .Count(sub => sub.StartsWith(target))

স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য পড়ুন, সেই অক্ষর থেকে শুরু করে বাকী স্ট্রিংটি একটি স্ট্রিং হিসাবে শুরু করুন; এটি যদি লক্ষ্য স্ট্রিং দিয়ে শুরু হয় তবে এটি গণনা করুন।


1
বর্ণিত বর্ণনার চেয়ে আমি কীভাবে এটি পরিষ্কারভাবে ব্যাখ্যা করতে পারি তা নিশ্চিত নয়। বিভ্রান্তি কি?
এমকিপিপি

58
সুপার স্লো! এটি এইচটিএমএল এর একটি পৃষ্ঠায় চেষ্টা করেছেন এবং এই পৃষ্ঠায় অন্যান্য পদ্ধতির তুলনায় প্রায় 2 মিনিট সময় নিয়েছিল যা 2 সেকেন্ড সময় নিয়েছিল। উত্তরটি সঠিক ছিল; এটি ব্যবহারযোগ্য হতে খুব ধীর ছিল।
জনবি

2
সম্মত, খুব ধীর আমি লিনক-স্টাইলের সমাধানগুলির একটি বড় অনুরাগী, তবে এটি কেবল কার্যকর নয়।
স্প্রেগ করুন

5
মনে রাখবেন যে এটি এত ধীর হওয়ার কারণ এটি এন স্ট্রিংগুলি তৈরি করে, এভাবে প্রায় n ^ 2/2 বাইট বরাদ্দ করে।
পিটার ক্র্যাবট্রি

6
আমার 210000 অক্ষরের স্ট্রিংয়ের জন্য আউট অফ মেমরিএক্সেপশন নিক্ষেপ করা হয়।
বাড়ি হইতে বাহিরে

66

আমি কিছু গবেষণা করে দেখেছি যে রিচার্ড ওয়াটসনের সমাধান বেশিরভাগ ক্ষেত্রেই দ্রুত হয়। পোস্টের প্রতিটি সমাধানের ফলাফল সহ এটি টেবিলে রয়েছে ( "টেস্ট {টেস্ট" এর মতো স্ট্রিংকে পার্স করার সময় এটি ব্যতিক্রম ছুঁড়ে ফেলেছে কারণ তারা রেইগেক্স ব্যবহার করে )

    Name      | Short/char |  Long/char | Short/short| Long/short |  Long/long |
    Inspite   |         134|        1853|          95|        1146|         671|
    LukeH_1   |         346|        4490|         N/A|         N/A|         N/A|
    LukeH_2   |         152|        1569|         197|        2425|        2171|
Bobwienholt   |         230|        3269|         N/A|         N/A|         N/A|
Richard Watson|          33|         298|         146|         737|         543|
StefanosKargas|         N/A|         N/A|         681|       11884|       12486|

আপনি দেখতে পাচ্ছেন যে সংক্ষিপ্ত স্ট্রিংগুলিতে সংক্ষিপ্ত সাবস্ট্রিংগুলির (1-5 অক্ষর) সংখ্যার সন্ধানের ক্ষেত্রে (10-50 অক্ষর) মূল অ্যালগরিদমকে অগ্রাধিকার দেওয়া হয়।

এছাড়াও, মাল্টিচার্যাক্টর সাবস্ট্রিংয়ের জন্য আপনার নিম্নলিখিত কোডগুলি ব্যবহার করা উচিত ( রিচার্ড ওয়াটসনের সমাধানের ভিত্তিতে )

int count = 0, n = 0;

if(substring != "")
{
    while ((n = source.IndexOf(substring, n, StringComparison.InvariantCulture)) != -1)
    {
        n += substring.Length;
        ++count;
    }
}

আমি আমার নিজের 'নিম্ন স্তরের' সমাধানটি যুক্ত করতে যাচ্ছিলাম (সাবস্ট্রিংগুলি তৈরি না করে, প্রতিস্থাপন / বিভাজন বা কোনও রেজেক্স / লিনক ব্যবহার না করে) তবে আপনার সম্ভবত আমার (এবং কমপক্ষে সংক্ষিপ্ত) থেকেও আরও ভাল। ধন্যবাদ!
ড্যান ডাব্লু

রেজেক্স সমাধানগুলির জন্য, একটিRegex.Escape(needle)
থাইমাইন

2
অন্যের জন্য কেবল উল্লেখ করার জন্য, খালি হলে অনুসন্ধান মানটি পরীক্ষা করা দরকার, অন্যথায় আপনি অসীম লুপে উঠবেন।
WhoIsRich

2
হতে পারে এটি কেবলমাত্র আমি, তবে source="aaa" substring="aa"আমি প্রত্যাশায় 2 ফিরে আসব, 1 টি নয় this এটিকে "ঠিক করতে", পরিবর্তন n += substring.Lengthকরুনn++
ytoledano

আপনি নিজের overlappedoverlapped=True;.... if(overlapped) {++n;} else {n += substring.Length;}
কেসটি

54

লিনকিউ সমস্ত সংগ্রহের উপর কাজ করে এবং যেহেতু স্ট্রিং কেবলমাত্র অক্ষরের সংগ্রহ, এটি কীভাবে এই সুন্দর ছোট্ট এক-লাইনার সম্পর্কে:

var count = source.Count(c => c == '/');

নিশ্চিত হয়ে নিন যে using System.Linq;আপনার কোড ফাইলের শীর্ষে রয়েছে, .Countসেই নামস্থান থেকে একটি এক্সটেনশন পদ্ধতি।


5
সত্যিই কি সেখানে ভার ব্যবহারের উপযুক্ত? সেখানে কি এমন কোনও সুযোগ রয়েছে যা গণনাটি এমন কোনও কিছুর সাথে প্রতিস্থাপন করা হবে যা কোনও প্রকার ফিরে আসে না?
হোয়াটসাইট

69
@ হোয়াটসিট: আপনি কেবল বাম হাত দিয়ে 'ভার' টাইপ করতে পারেন যখন 'ইনট' উভয় হাতের প্রয়োজন;)
শান ব্রাইট

7
intচিঠিগুলি সমস্ত হোম কীগুলিতে থাকে, যদিও varনা। আহ .. অপেক্ষা করুন, আমি ডিভোরাক ব্যবহার করছি
মাইকেল বুয়েন

2
@ বিডোটা নিশ্চিত করুন যে আপনার একটি 'সিস্টেম.লিনক ব্যবহার করছেন'; আপনার ফাইলের শীর্ষে। এছাড়াও, ইন্টেলিজেন্স লুকিয়ে থাকতে পারে C তবুও, এটি সংকলন এবং ঠিক জরিমানা হবে।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

3
@ জুডাহা গ্যাব্রিয়েল হিমাঙ্গো আমি যুক্তি দেব যে ভেরিয়েবলের
ধরণটি

50
string source = "/once/upon/a/time/";
int count = 0;
int n = 0;

while ((n = source.IndexOf('/', n)) != -1)
{
   n++;
   count++;
}

আমার কম্পিউটারে এটি 50 মিলিয়ন পুনরাবৃত্তির জন্য প্রতি-অক্ষর সমাধানের চেয়ে প্রায় 2 সেকেন্ড দ্রুত।

2013 রিভিশন:

স্ট্রিংটিকে একটি চরে [] পরিবর্তন করুন এবং তার মাধ্যমে পুনরাবৃত্তি করুন। 50 মিটার পুনরাবৃত্তির জন্য মোট সময় ছাড়িয়ে আরও দ্বিতীয় বা দু'টি কেটে দেয়!

char[] testchars = source.ToCharArray();
foreach (char c in testchars)
{
     if (c == '/')
         count++;
}

এটি এখনও দ্রুত:

char[] testchars = source.ToCharArray();
int length = testchars.Length;
for (int n = 0; n < length; n++)
{
    if (testchars[n] == '/')
        count++;
}

ভাল পরিমাপের জন্য, অ্যারের শেষ থেকে 0 পর্যন্ত পুনরাবৃত্তিটি প্রায় 5% দ্বারা দ্রুততম বলে মনে হয়।

int length = testchars.Length;
for (int n = length-1; n >= 0; n--)
{
    if (testchars[n] == '/')
        count++;
}

আমি ভাবছিলাম যে এটি কেন হতে পারে এবং গুগলিং হয়ে যাচ্ছিল (আমি বিপরীত পুনরুক্তি সম্পর্কে দ্রুত কিছু হওয়া সম্পর্কে স্মরণ করছি), এবং এই এত প্রশ্নে এসেছিল যা ইতিমধ্যে বিরক্তিকরভাবে স্ট্রিংটিকে চর [[] চরিত্রে ব্যবহার করে যা ইতিমধ্যে কৌশলটি ব্যবহার করে। যদিও আমি মনে করি বিপরীতমুখী কৌশলটি এই প্রসঙ্গে নতুন।

C # তে স্ট্রিংয়ের স্বতন্ত্র অক্ষরগুলির মাধ্যমে পুনরাবৃত্তি করার দ্রুততম কোনটি?


1
আপনি source.IndexOf('/', n + 1)যখন n++এবং এর বন্ধনীগুলি রাখতে এবং হারাতে পারেন :) এছাড়াও, string word = "/"অক্ষরের পরিবর্তে একটি ভেরিয়েবল স্থাপন করতে পারেন।
নীকো

1
আরে নিকো, নতুন উত্তর চেকআউট করুন। ভেরিয়েবল-লেংথ সাবস্ট্রিং তৈরি করা শক্ত হতে পারে।
রিচার্ড ওয়াটসন

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

1
আমি কোথাও পড়েছি যে এটি পিছনে পুনরাবৃত্তি করতে দ্রুততর কারণ এটির সাথে 0
রেগেগুইটার

1
@ শিটপয়েট আপ আপনি যদি অন্তর্নিহিত কোডটি দেখেন তবে এটি একটি স্থানীয় কল। পাবলিক চর [] টুচ্যারআরে () {... System.arraycopy (মান, 0, ফলাফল, 0, মান. দৈর্ঘ্য); ...}
রিচার্ড ওয়াটসন

46

এই উভয়ই কেবল একক-অক্ষর অনুসন্ধানের পদগুলির জন্য কাজ করে ...

countOccurences("the", "the answer is the answer");

int countOccurences(string needle, string haystack)
{
    return (haystack.Length - haystack.Replace(needle,"").Length) / needle.Length;
}

দীর্ঘতর সূঁচের জন্য আরও ভাল হতে পারে ...

তবে আরও মার্জিত উপায় থাকতে হবে। :)


একাধিক-অক্ষর প্রতিস্থাপনের জন্য অ্যাকাউন্ট করতে। এটি ছাড়া, "পরীক্ষায়" "
চাওয়াটি

বেঞ্চমার্কযুক্ত এবং স্ট্রিংয়ের সাথে এটি তুলনা করে pস্প্লিট-ওয়ে - প্রায় 1.5 গুণ দ্রুত কাজ করে। যশ।
অ্যালেক্স

20

সম্পাদনা:

source.Split('/').Length-1

2
এই আমি কি কি. এবং source.Split(new[]{"//"}, StringSplitOptions.None).Count - 1বহু-চরিত্র বিভাজক জন্য।
bzlm

4
এটি হিপগুলিতে কমপক্ষে এন স্ট্রিং বরাদ্দগুলি সম্পাদন করবে, প্লাস (সম্ভবত) কয়েকটি অ্যারে পুনরায় মাপ - এবং এই সব কি কেবল গণনা পেতে? চূড়ান্তভাবে অক্ষম, ভাল স্কেল করে না এবং কোনও গুরুত্বপূর্ণ কোডে কখনও ব্যবহার করা উচিত নয়।
জার শারদান

17

সি # তে, একটি দুর্দান্ত স্ট্রিং সাবস্ট্রিং কাউন্টার হ'ল এটি অপ্রত্যাশিতভাবে কৌশলযুক্ত সহযোগী:

public static int CCount(String haystack, String needle)
{
    return haystack.Split(new[] { needle }, StringSplitOptions.None).Length - 1;
}

1
দুর্দান্ত সমাধান - এবং স্ট্রিংয়ের জন্যও কাজ করছে (কেবল চর নয়)!
ChriPf

ধন্যবাদ, ভাষা অদলবদল করার সময় স্ট্রিং হ্যান্ডলিংয়ের কয়েকটি সূক্ষ্মতাগুলি ভুলে যাওয়া খুব সহজ - যেমন আমাদের বেশিরভাগ মানুষকে আজকাল করতে হয়!
ডেভ

1
-1 কারণ: আপনি কি গণনা () এবং গণনা বা দৈর্ঘ্যের মধ্যে পার্থক্য জানেন? যদি কেউ গণনা বা দৈর্ঘ্যের পরিবর্তে গণনা () ব্যবহার করে থাকে তবে আমি ট্রিগার হয়ে যাই। গণনা () আইনিমরেটর তৈরি করে তারপরে আইনিউমারেবলের সমস্ত উপস্থিতির মধ্য দিয়ে যায় যেখানে গণনা বা দৈর্ঘ্য ইতিমধ্যে অবজেক্টের বৈশিষ্ট্য নির্ধারণ করে যা ইতিমধ্যে সমস্ত উপাদানগুলির পুনরাবৃত্তি না করে আপনি চান গণনাটি ধারণ করে।
এ্যারোসন

ভাল স্পট এবং কি আজব এটি আমার লাইব্রেরিতে, যেখান থেকে আমি ফাংশনটি নিয়েছি, আমি "দৈর্ঘ্য" ব্যবহার করছি। সম্পাদিত!
ডেভ

15
Regex.Matches(input,  Regex.Escape("stringToMatch")).Count

1
ইনপুট কনটেটেন্ট রেজেক্স বিশেষ অক্ষর অর্থাত্ | | যদি এটি সঠিক হয় না একটি রেইজেক্স থাকা দরকার Eস্ক্রপ (ইনপুট)
পেডারসেন

1
আসলে stringToMatchপলায়নের চাহিদা, না input
থিওডর জৌলিয়াস

তুমি সঠিক. ঠিক কর.
সিডারলফ

13
private int CountWords(string text, string word) {
    int count = (text.Length - text.Replace(word, "").Length) / word.Length;
    return count;
}

কারণ আসল সমাধানটি চরগুলির জন্য দ্রুততম ছিল, আমি মনে করি এটি স্ট্রিংগুলির জন্যও হবে। সুতরাং এখানে আমার অবদান।

প্রসঙ্গে: আমি লগ ফাইলে 'ব্যর্থ' এবং 'সফল' এর মতো শব্দ খুঁজছিলাম।

গ্র, বেন


2
"শব্দের" পরিবর্তনশীল (শূন্য ত্রুটির দ্বারা বিভাগ) এর জন্য খালি স্ট্রিংটি পাস করবেন না।
অ্যান্ড্রু জেনস

12
string s = "65 fght 6565 4665 hjk";
int count = 0;
foreach (Match m in Regex.Matches(s, "65"))
  count++;

20
বা রেজেক্স. ম্যাচগুলি (গুলি, "65") Count _ ^
মেটা

প্রতিটি স্ট্রিংয়ের জন্য নয়।
মার্শ-উইগল

7

যে কেউ স্ট্রিং এক্সটেনশন পদ্ধতি ব্যবহারের জন্য প্রস্তুত হতে চায়,

এখানে আমি ব্যবহার করি যা পোস্ট করা উত্তরের উপর ভিত্তি করে ছিল:

public static class StringExtension
{    
    /// <summary> Returns the number of occurences of a string within a string, optional comparison allows case and culture control. </summary>
    public static int Occurrences(this System.String input, string value, StringComparison stringComparisonType = StringComparison.Ordinal)
    {
        if (String.IsNullOrEmpty(value)) return 0;

        int count    = 0;
        int position = 0;

        while ((position = input.IndexOf(value, position, stringComparisonType)) != -1)
        {
            position += value.Length;
            count    += 1;
        }

        return count;
    }

    /// <summary> Returns the number of occurences of a single character within a string. </summary>
    public static int Occurrences(this System.String input, char value)
    {
        int count = 0;
        foreach (char c in input) if (c == value) count += 1;
        return count;
    }
}

স্ট্রিংটি নাল বা খালি থাকলে দ্বিতীয় পদ্ধতিটি কী গড়াবে না? বিশুদ্ধরূপে শৈলীর দৃষ্টিকোণ থেকে, আপনি কেবল স্ট্রিংয়ের চেয়ে ইনপুটটিকে সিস্টেম.স্ট্রিং হিসাবে কী সংজ্ঞায়িত করছেন?
নোডয়েড

7
public static int GetNumSubstringOccurrences(string text, string search)
{
    int num = 0;
    int pos = 0;

    if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(search))
    {
        while ((pos = text.IndexOf(search, pos)) > -1)
        {
            num ++;
            pos += search.Length;
        }
    }
    return num;
}

5

আমি মনে করি এটির সবচেয়ে সহজ উপায় হ'ল নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করা। এইভাবে আপনি মাইভার.স্প্লেট ('x') ব্যবহার করে তবে একাধিক অক্ষর সেটিংয়ে একই বিভাজন গণনা পেতে পারেন।

string myVar = "do this to count the number of words in my wording so that I can word it up!";
int count = Regex.Split(myVar, "word").Length;

3
string search = "/string";
var occurrences = (regex.Match(search, @"\/")).Count;

এটি প্রতিটি সময় প্রোগ্রামটিকে "/ গুলি" হুবহু (কেস সংবেদনশীল) সন্ধান করবে এবং এর উপস্থিতিগুলির সংখ্যাটি ভেরিয়েবল "উপস্থিতি" এ সংরক্ষণ করা হবে


3

আমি অনুভব করেছি যে আমাদের মধ্যে কিছু ধরণের সাব স্ট্রিং গণনা যেমন অনিরাপদ বাই-বাই বাই তুলনা রয়েছে তার অভাব রয়েছে। আমি মূল পোস্টারের পদ্ধতি এবং আমি যে কোনও পদ্ধতিতে ভাবতে পারি তা এক সাথে রেখেছি।

এগুলি আমি তৈরি স্ট্রিং এক্সটেনশনগুলি।

namespace Example
{
    using System;
    using System.Text;

    public static class StringExtensions
    {
        public static int CountSubstr(this string str, string substr)
        {
            return (str.Length - str.Replace(substr, "").Length) / substr.Length;
        }

        public static int CountSubstr(this string str, char substr)
        {
            return (str.Length - str.Replace(substr.ToString(), "").Length);
        }

        public static int CountSubstr2(this string str, string substr)
        {
            int substrlen = substr.Length;
            int lastIndex = str.IndexOf(substr, 0, StringComparison.Ordinal);
            int count = 0;
            while (lastIndex != -1)
            {
                ++count;
                lastIndex = str.IndexOf(substr, lastIndex + substrlen, StringComparison.Ordinal);
            }

            return count;
        }

        public static int CountSubstr2(this string str, char substr)
        {
            int lastIndex = str.IndexOf(substr, 0);
            int count = 0;
            while (lastIndex != -1)
            {
                ++count;
                lastIndex = str.IndexOf(substr, lastIndex + 1);
            }

            return count;
        }

        public static int CountChar(this string str, char substr)
        {
            int length = str.Length;
            int count = 0;
            for (int i = 0; i < length; ++i)
                if (str[i] == substr)
                    ++count;

            return count;
        }

        public static int CountChar2(this string str, char substr)
        {
            int count = 0;
            foreach (var c in str)
                if (c == substr)
                    ++count;

            return count;
        }

        public static unsafe int CountChar3(this string str, char substr)
        {
            int length = str.Length;
            int count = 0;
            fixed (char* chars = str)
            {
                for (int i = 0; i < length; ++i)
                    if (*(chars + i) == substr)
                        ++count;
            }

            return count;
        }

        public static unsafe int CountChar4(this string str, char substr)
        {
            int length = str.Length;
            int count = 0;
            fixed (char* chars = str)
            {
                for (int i = length - 1; i >= 0; --i)
                    if (*(chars + i) == substr)
                        ++count;
            }

            return count;
        }

        public static unsafe int CountSubstr3(this string str, string substr)
        {
            int length = str.Length;
            int substrlen = substr.Length;
            int count = 0;
            fixed (char* strc = str)
            {
                fixed (char* substrc = substr)
                {
                    int n = 0;

                    for (int i = 0; i < length; ++i)
                    {
                        if (*(strc + i) == *(substrc + n))
                        {
                            ++n;
                            if (n == substrlen)
                            {
                                ++count;
                                n = 0;
                            }
                        }
                        else
                            n = 0;
                    }
                }
            }

            return count;
        }

        public static int CountSubstr3(this string str, char substr)
        {
            return CountSubstr3(str, substr.ToString());
        }

        public static unsafe int CountSubstr4(this string str, string substr)
        {
            int length = str.Length;
            int substrLastIndex = substr.Length - 1;
            int count = 0;
            fixed (char* strc = str)
            {
                fixed (char* substrc = substr)
                {
                    int n = substrLastIndex;

                    for (int i = length - 1; i >= 0; --i)
                    {
                        if (*(strc + i) == *(substrc + n))
                        {
                            if (--n == -1)
                            {
                                ++count;
                                n = substrLastIndex;
                            }
                        }
                        else
                            n = substrLastIndex;
                    }
                }
            }

            return count;
        }

        public static int CountSubstr4(this string str, char substr)
        {
            return CountSubstr4(str, substr.ToString());
        }
    }
}

পরীক্ষার কোড অনুসরণ করে ...

static void Main()
{
    const char matchA = '_';
    const string matchB = "and";
    const string matchC = "muchlongerword";
    const string testStrA = "_and_d_e_banna_i_o___pfasd__and_d_e_banna_i_o___pfasd_";
    const string testStrB = "and sdf and ans andeians andano ip and and sdf and ans andeians andano ip and";
    const string testStrC =
        "muchlongerword amuchlongerworsdfmuchlongerwordsdf jmuchlongerworijv muchlongerword sdmuchlongerword dsmuchlongerword";
    const int testSize = 1000000;
    Console.WriteLine(testStrA.CountSubstr('_'));
    Console.WriteLine(testStrA.CountSubstr2('_'));
    Console.WriteLine(testStrA.CountSubstr3('_'));
    Console.WriteLine(testStrA.CountSubstr4('_'));
    Console.WriteLine(testStrA.CountChar('_'));
    Console.WriteLine(testStrA.CountChar2('_'));
    Console.WriteLine(testStrA.CountChar3('_'));
    Console.WriteLine(testStrA.CountChar4('_'));
    Console.WriteLine(testStrB.CountSubstr("and"));
    Console.WriteLine(testStrB.CountSubstr2("and"));
    Console.WriteLine(testStrB.CountSubstr3("and"));
    Console.WriteLine(testStrB.CountSubstr4("and"));
    Console.WriteLine(testStrC.CountSubstr("muchlongerword"));
    Console.WriteLine(testStrC.CountSubstr2("muchlongerword"));
    Console.WriteLine(testStrC.CountSubstr3("muchlongerword"));
    Console.WriteLine(testStrC.CountSubstr4("muchlongerword"));
    var timer = new Stopwatch();
    timer.Start();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountSubstr(matchA);
    timer.Stop();
    Console.WriteLine("CS1 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrB.CountSubstr(matchB);
    timer.Stop();
    Console.WriteLine("CS1 and: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrC.CountSubstr(matchC);
    timer.Stop();
    Console.WriteLine("CS1 mlw: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountSubstr2(matchA);
    timer.Stop();
    Console.WriteLine("CS2 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrB.CountSubstr2(matchB);
    timer.Stop();
    Console.WriteLine("CS2 and: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrC.CountSubstr2(matchC);
    timer.Stop();
    Console.WriteLine("CS2 mlw: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountSubstr3(matchA);
    timer.Stop();
    Console.WriteLine("CS3 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrB.CountSubstr3(matchB);
    timer.Stop();
    Console.WriteLine("CS3 and: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrC.CountSubstr3(matchC);
    timer.Stop();
    Console.WriteLine("CS3 mlw: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountSubstr4(matchA);
    timer.Stop();
    Console.WriteLine("CS4 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrB.CountSubstr4(matchB);
    timer.Stop();
    Console.WriteLine("CS4 and: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrC.CountSubstr4(matchC);
    timer.Stop();
    Console.WriteLine("CS4 mlw: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountChar(matchA);
    timer.Stop();
    Console.WriteLine("CC1 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountChar2(matchA);
    timer.Stop();
    Console.WriteLine("CC2 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountChar3(matchA);
    timer.Stop();
    Console.WriteLine("CC3 chr: " + timer.Elapsed.TotalMilliseconds + "ms");

    timer.Restart();
    for (int i = 0; i < testSize; ++i)
        testStrA.CountChar4(matchA);
    timer.Stop();
    Console.WriteLine("CC4 chr: " + timer.Elapsed.TotalMilliseconds + "ms");
}

ফলাফল: সিএসএক্স কাউন্টসউবস্ট্রাক্সের সাথে সাদৃশ্যযুক্ত এবং সিসিএক্স কাউন্টচরএক্সের সাথে সম্পর্কিত। "chr" '_', "এর জন্য একটি স্ট্রিং অনুসন্ধান করে এবং" এবং "এর জন্য একটি স্ট্রিং সন্ধান করে এবং" এমএলডাব্লু "" লটলঞ্জারওয়ার্ড "এর জন্য একটি স্ট্রিং সন্ধান করে

CS1 chr: 824.123ms
CS1 and: 586.1893ms
CS1 mlw: 486.5414ms
CS2 chr: 127.8941ms
CS2 and: 806.3918ms
CS2 mlw: 497.318ms
CS3 chr: 201.8896ms
CS3 and: 124.0675ms
CS3 mlw: 212.8341ms
CS4 chr: 81.5183ms
CS4 and: 92.0615ms
CS4 mlw: 116.2197ms
CC1 chr: 66.4078ms
CC2 chr: 64.0161ms
CC3 chr: 65.9013ms
CC4 chr: 65.8206ms

এবং অবশেষে, আমার কাছে একটি ফাইল ছিল 3.6 মিলিয়ন অক্ষর। এটি "ডের্প অ্যাড্ডারডসার্প ডিফার্পডার্প ডিজডার্প" 100,000 বার পুনরাবৃত্তি হয়েছিল। আমি এই ফলাফলগুলির 100 বার উপরোক্ত পদ্ধতিতে ফাইলের অভ্যন্তরে "ডার্প" অনুসন্ধান করেছি।

CS1Derp: 1501.3444ms
CS2Derp: 1585.797ms
CS3Derp: 376.0937ms
CS4Derp: 271.1663ms

সুতরাং আমার চতুর্থ পদ্ধতিটি অবশ্যই বিজয়ী, তবে, বাস্তবিকভাবে, যদি 3.6 মিলিয়ন চরিত্রের ফাইলটি 100 বার কেবলমাত্র 1586ms কে আরও খারাপ পরিস্থিতি হিসাবে গ্রহণ করে, তবে এই সমস্ত কিছুই একেবারেই তুচ্ছ।

যাইহোক, আমি ৩.6 মিলিয়ন চরিত্রের ফাইলটিতে 100 বার কাউন্টসব্রাস্টার এবং কাউন্টচর পদ্ধতিতে 'ডি' চরের জন্যও স্ক্যান করেছি। ফলাফল ...

CS1  d : 2606.9513ms
CS2  d : 339.7942ms
CS3  d : 960.281ms
CS4  d : 233.3442ms
CC1  d : 302.4122ms
CC2  d : 280.7719ms
CC3  d : 299.1125ms
CC4  d : 292.9365ms

মূল পোস্টার পদ্ধতিটি এটি অনুসারে একটি বৃহত খড়ের কাঁধে একক অক্ষর সূঁচের জন্য খুব খারাপ।

দ্রষ্টব্য: সংস্করণ আউটপুট প্রকাশের জন্য সমস্ত মান আপডেট করা হয়েছিল। আমি দুর্ঘটনাক্রমে আমি প্রথম পোস্ট করার পরে রিলিজ মোড তৈরি করতে ভুলে গিয়েছিলাম। আমার কিছু বক্তব্য সংশোধন করা হয়েছে।


পারফরম্যান্স ফলাফলের জন্য আপনাকে ধন্যবাদ। 10 গতির একটি ফ্যাক্টর পার্থক্য একটি লিনাক বা অন্যান্য ঝরঝরে লিখিত সমাধান বিবেচনা না করে একটি এক্সটেনশন পদ্ধতিতে যেতে না পারার কারণ হতে পারে।
আন্ড্রেয়াস রিফ

2

স্ট্রিংগুলির উপস্থিতির জন্য একটি জেনেরিক ফাংশন:

public int getNumberOfOccurencies(String inputString, String checkString)
{
    if (checkString.Length > inputString.Length || checkString.Equals("")) { return 0; }
    int lengthDifference = inputString.Length - checkString.Length;
    int occurencies = 0;
    for (int i = 0; i < lengthDifference; i++) {
        if (inputString.Substring(i, checkString.Length).Equals(checkString)) { occurencies++; i += checkString.Length - 1; } }
    return occurencies;
}

2
এটি একটি বিশাল সংখ্যক অস্থায়ী স্ট্রিং তৈরি করে এবং আবর্জনা সংগ্রহকারীকে খুব কঠোর করে তোলে।
এরিকলও

2
string source = "/once/upon/a/time/";
int count = 0, n = 0;
while ((n = source.IndexOf('/', n) + 1) != 0) count++;

রিচার্ড ওয়াটসনের উত্তরের একটি পার্থক্য, দক্ষতার উন্নতি করার সাথে সামান্য দ্রুততরভাবে চরটি স্ট্রিংয়ের সাথে যতবার দেখা যায় ততই কম কোড এবং কম কোড!

যদিও আমি অবশ্যই বলব, প্রতিটি দৃশ্যের ব্যাপকভাবে পরীক্ষা না করেও আমি ব্যবহার করে খুব তাত্পর্যপূর্ণ গতির উন্নতি দেখতে পেয়েছি:

int count = 0;
for (int n = 0; n < source.Length; n++) if (source[n] == '/') count++;

2
            var conditionalStatement = conditionSetting.Value;

            //order of replace matters, remove == before =, incase of ===
            conditionalStatement = conditionalStatement.Replace("==", "~").Replace("!=", "~").Replace('=', '~').Replace('!', '~').Replace('>', '~').Replace('<', '~').Replace(">=", "~").Replace("<=", "~");

            var listOfValidConditions = new List<string>() { "!=", "==", ">", "<", ">=", "<=" };

            if (conditionalStatement.Count(x => x == '~') != 1)
            {
                result.InvalidFieldList.Add(new KeyFieldData(batch.DECurrentField, "The IsDoubleKeyCondition does not contain a supported conditional statement. Contact System Administrator."));
                result.Status = ValidatorStatus.Fail;
                return result;
            }

একটি স্ট্রিং থেকে শর্তসাপূর্ণ বিবৃতি পরীক্ষা করার অনুরূপ কিছু করা দরকার।

আমি একক চরিত্রের সাথে যা খুঁজছিলাম তা প্রতিস্থাপন করে এবং একক চরিত্রের উদাহরণগুলি গণনা করেছি।

স্পষ্টতই আপনি যে একক অক্ষরটি ব্যবহার করছেন সেটি ভুল গণনা এড়ানোর জন্য স্ট্রিংয়ের অস্তিত্ব না থাকার জন্য এটি পরীক্ষা করা দরকার।


2

স্ট্রিং স্ট্রিং:

"ইত্যাদি" তে ".. জেডি জেডি জেডি জেডি জেডি ইত্যাদি এবং ইত্যাদি জেডিজেডিজেডিজেডিজেডিজেডিজেডিজেডি এবং" "অনুসন্ধান করুন

var strOrigin = " .. JD JD JD JD etc. and etc. JDJDJDJDJDJDJDJD and etc.";
var searchStr = "etc";
int count = (strOrigin.Length - strOrigin.Replace(searchStr, "").Length)/searchStr.Length.

এটিকে নিরবচ্ছিন্ন / আনাড়ি হিসাবে ত্যাগ করার আগে কর্মক্ষমতা পরীক্ষা করুন ...


2

আমার প্রাথমিক গ্রহণ আমাকে এরকম কিছু দিয়েছে:

public static int CountOccurrences(string original, string substring)
{
    if (string.IsNullOrEmpty(substring))
        return 0;
    if (substring.Length == 1)
        return CountOccurrences(original, substring[0]);
    if (string.IsNullOrEmpty(original) ||
        substring.Length > original.Length)
        return 0;
    int substringCount = 0;
    for (int charIndex = 0; charIndex < original.Length; charIndex++)
    {
        for (int subCharIndex = 0, secondaryCharIndex = charIndex; subCharIndex < substring.Length && secondaryCharIndex < original.Length; subCharIndex++, secondaryCharIndex++)
        {
            if (substring[subCharIndex] != original[secondaryCharIndex])
                goto continueOuter;
        }
        if (charIndex + substring.Length > original.Length)
            break;
        charIndex += substring.Length - 1;
        substringCount++;
    continueOuter:
        ;
    }
    return substringCount;
}

public static int CountOccurrences(string original, char @char)
{
    if (string.IsNullOrEmpty(original))
        return 0;
    int substringCount = 0;
    for (int charIndex = 0; charIndex < original.Length; charIndex++)
        if (@char == original[charIndex])
            substringCount++;
    return substringCount;
}

প্রতিস্থাপন এবং বিভাগ ব্যবহার করে খড়ের কাঁটার পদ্ধতির সুইটি 21+ সেকেন্ডে ফলন দেয় যেখানে প্রায় 15.2 লাগে।

কিছু যুক্ত করার পরে সম্পাদনা করুন যা যুক্ত করবে substring.Length - 1 CharIndex- এ যুক্ত করবে (এটি হওয়া উচিত), এটি ১১..6 সেকেন্ডে।

সম্পাদনা 2: আমি 26 টি দ্বি-চরিত্রের স্ট্রিংযুক্ত একটি স্ট্রিং ব্যবহার করেছি, এখানে একই নমুনা পাঠ্যে আপডেট হওয়া সময়গুলি এখানে:

একটি খড়ের নখের (ওপি'র সংস্করণ): 7.8 সেকেন্ড

প্রস্তাবিত প্রক্রিয়া: 4.6 সেকেন্ড।

সম্পাদনা 3: একক অক্ষর কর্নার-কেস যুক্ত করে এটি 1.2 সেকেন্ডে চলে গেছে।

সম্পাদনা 4: প্রসঙ্গে: 50 মিলিয়ন পুনরাবৃত্তি ব্যবহৃত হয়েছিল।


2

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

সম্পাদনা: ঠিক আছে - সুতরাং এই এত প্রশ্নটি আমাকে ভাবছে যে আমাদের বর্তমান বাস্তবায়নের পারফরম্যান্স এখানে উপস্থাপিত কিছু সমাধানের বিপরীতে কীভাবে দাঁড়াবে। আমি একটি সামান্য বেঞ্চ চিহ্নিত করার সিদ্ধান্ত নিয়েছি এবং দেখতে পেয়েছি যে রিচার্ড ওয়াটসন প্রদত্ত সমাধানটির কার্য সম্পাদনের সাথে আমাদের সমাধানটি অনেকটা সঙ্গতিপূর্ণ যতক্ষণ না আপনি বড় স্ট্রিং (100 কেবি +), বৃহত সাবস্ট্রিংগুলি (32 কেবি +) দিয়ে আক্রমণাত্মক অনুসন্ধান until ) এবং অনেক এম্বেড থাকা পুনরাবৃত্তি (10 কে +)। এই মুহুর্তে আমাদের দ্রবণটি 2X থেকে 4X এর ধীরে ছিল। এটি এবং সত্য যে আমরা রিচার্ড ওয়াটসনের উপস্থাপিত সমাধানটি সত্যই পছন্দ করি এবং এটি অনুসারে আমরা আমাদের সমাধানটি রিফ্যাক্টর করেছি। আমি কেবল এটির জন্য উপকার পেতে পারে এমন কারও জন্য এটি উপলব্ধ করতে চেয়েছিলাম।

আমাদের মূল সমাধান:

    /// <summary>
    /// Counts the number of occurrences of the specified substring within
    /// the current string.
    /// </summary>
    /// <param name="s">The current string.</param>
    /// <param name="substring">The substring we are searching for.</param>
    /// <param name="aggressiveSearch">Indicates whether or not the algorithm 
    /// should be aggressive in its search behavior (see Remarks). Default 
    /// behavior is non-aggressive.</param>
    /// <remarks>This algorithm has two search modes - aggressive and 
    /// non-aggressive. When in aggressive search mode (aggressiveSearch = 
    /// true), the algorithm will try to match at every possible starting 
    /// character index within the string. When false, all subsequent 
    /// character indexes within a substring match will not be evaluated. 
    /// For example, if the string was 'abbbc' and we were searching for 
    /// the substring 'bb', then aggressive search would find 2 matches 
    /// with starting indexes of 1 and 2. Non aggressive search would find 
    /// just 1 match with starting index at 1. After the match was made, 
    /// the non aggressive search would attempt to make it's next match 
    /// starting at index 3 instead of 2.</remarks>
    /// <returns>The count of occurrences of the substring within the string.</returns>
    public static int CountOccurrences(this string s, string substring, 
        bool aggressiveSearch = false)
    {
        // if s or substring is null or empty, substring cannot be found in s
        if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(substring))
            return 0;

        // if the length of substring is greater than the length of s,
        // substring cannot be found in s
        if (substring.Length > s.Length)
            return 0;

        var sChars = s.ToCharArray();
        var substringChars = substring.ToCharArray();
        var count = 0;
        var sCharsIndex = 0;

        // substring cannot start in s beyond following index
        var lastStartIndex = sChars.Length - substringChars.Length;

        while (sCharsIndex <= lastStartIndex)
        {
            if (sChars[sCharsIndex] == substringChars[0])
            {
                // potential match checking
                var match = true;
                var offset = 1;
                while (offset < substringChars.Length)
                {
                    if (sChars[sCharsIndex + offset] != substringChars[offset])
                    {
                        match = false;
                        break;
                    }
                    offset++;
                }
                if (match)
                {
                    count++;
                    // if aggressive, just advance to next char in s, otherwise, 
                    // skip past the match just found in s
                    sCharsIndex += aggressiveSearch ? 1 : substringChars.Length;
                }
                else
                {
                    // no match found, just move to next char in s
                    sCharsIndex++;
                }
            }
            else
            {
                // no match at current index, move along
                sCharsIndex++;
            }
        }

        return count;
    }

এবং এখানে আমাদের সংশোধিত সমাধান:

    /// <summary>
    /// Counts the number of occurrences of the specified substring within
    /// the current string.
    /// </summary>
    /// <param name="s">The current string.</param>
    /// <param name="substring">The substring we are searching for.</param>
    /// <param name="aggressiveSearch">Indicates whether or not the algorithm 
    /// should be aggressive in its search behavior (see Remarks). Default 
    /// behavior is non-aggressive.</param>
    /// <remarks>This algorithm has two search modes - aggressive and 
    /// non-aggressive. When in aggressive search mode (aggressiveSearch = 
    /// true), the algorithm will try to match at every possible starting 
    /// character index within the string. When false, all subsequent 
    /// character indexes within a substring match will not be evaluated. 
    /// For example, if the string was 'abbbc' and we were searching for 
    /// the substring 'bb', then aggressive search would find 2 matches 
    /// with starting indexes of 1 and 2. Non aggressive search would find 
    /// just 1 match with starting index at 1. After the match was made, 
    /// the non aggressive search would attempt to make it's next match 
    /// starting at index 3 instead of 2.</remarks>
    /// <returns>The count of occurrences of the substring within the string.</returns>
    public static int CountOccurrences(this string s, string substring, 
        bool aggressiveSearch = false)
    {
        // if s or substring is null or empty, substring cannot be found in s
        if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(substring))
            return 0;

        // if the length of substring is greater than the length of s,
        // substring cannot be found in s
        if (substring.Length > s.Length)
            return 0;

        int count = 0, n = 0;
        while ((n = s.IndexOf(substring, n, StringComparison.InvariantCulture)) != -1)
        {
            if (aggressiveSearch)
                n++;
            else
                n += substring.Length;
            count++;
        }

        return count;
    }

1
string Name = "Very good nice one is very good but is very good nice one this is called the term";
bool valid=true;
int count = 0;
int k=0;
int m = 0;
while (valid)
{
    k = Name.Substring(m,Name.Length-m).IndexOf("good");
    if (k != -1)
    {
        count++;
        m = m + k + 4;
    }
    else
        valid = false;
}
Console.WriteLine(count + " Times accures");

1
string s = "HOWLYH THIS ACTUALLY WORKSH WOWH";
int count = 0;
for (int i = 0; i < s.Length; i++)
   if (s[i] == 'H') count++;

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


1

আপনি যদি এই ওয়েবপৃষ্ঠাটি পরীক্ষা করে দেখে থাকেন তবে 15 টি বিভিন্ন উপায়ের সমান্তরাল লুপ ব্যবহার করে বেনমার্কযুক্ত।

দ্রুততম উপায়টি হয় লুপের জন্য একক থ্রেডযুক্ত (যদি আপনার কাছে। নেট সংস্করণ <4.0 থাকে) বা একটি সমান্তরাল। লুপ (যদি হাজার হাজার চেক সহ নেট নেট> 4.0 ব্যবহার করা হয়) ব্যবহার করা হয় be

"এসএস" ধরে নেওয়া আপনার অনুসন্ধানের স্ট্রিং, "সিএইচ" আপনার চরিত্রের অ্যারে (যদি আপনার একাধিক চর থাকে তবে আপনি খুঁজে পান), এখানে কোডের মূল সূচনাটি যা দ্রুততম রান চালানোর সময় একক থ্রেডযুক্ত ছিল:

for (int x = 0; x < ss.Length; x++)
{
    for (int y = 0; y < ch.Length; y++)
    {
        for (int a = 0; a < ss[x].Length; a++ )
        {
        if (ss[x][a] == ch[y])
            //it's found. DO what you need to here.
        }
    }
}

মাপদণ্ডের সোর্স কোডও সরবরাহ করা হয়েছে যাতে আপনি নিজের পরীক্ষা চালাতে পারেন।


1
str="aaabbbbjjja";
int count = 0;
int size = str.Length;

string[] strarray = new string[size];
for (int i = 0; i < str.Length; i++)
{
    strarray[i] = str.Substring(i, 1);
}
Array.Sort(strarray);
str = "";
for (int i = 0; i < strarray.Length - 1; i++)
{

    if (strarray[i] == strarray[i + 1])
    {

        count++;
    }
    else
    {
        count++;
        str = str + strarray[i] + count;
        count = 0;
    }

}
count++;
str = str + strarray[strarray.Length - 1] + count;

এটি চরিত্রের উপস্থিতি গণনা করার জন্য। এই উদাহরণের জন্য আউটপুট হবে "a4b4j3"


2
আরও 'স্ট্রিংয়ের ঘটনা গণনা' নয় আরও বেশি চরিত্র গণনা - নরেন্দাকে কী স্ট্রিংয়ের সাথে মেলে তা নির্দিষ্ট করার উপায় কীভাবে?
পল সুলিভান

1
int গণনা = 0; স্ট্রিং স্ট্র = "আমাদের কাছে ফু ও ফু রয়েছে দয়া করে এতে ফু গণনা করুন"; স্ট্রিং স্ট্রোকিউরেন্স = "foo"; স্ট্রিং [] স্ট্র্রে = str.Split (''); Array.Sort (strarray); str = ""; (int i = 0; i <strarray.Length - 1; i ++) {যদি (স্ট্রেরে [i] == স্ট্রোকুরিয়েন্স) {গণনা ++; }} str = "" স্ট্রোকিউরেন্স + "এর জন্য উপস্থিতির সংখ্যা" + গণনা; এটির মাধ্যমে আপনি এই উদাহরণটিতে যে কোনও স্ট্রিং সংঘাত গণনা করতে পারেন আমি "ফু" এর উপস্থিতি গণনা করছি এবং এটি আমাকে আউটপুট দেবে 3.
নরেন্দ্র কুমার

1

স্ট্রিং ডিলিমিটারের ক্ষেত্রে (বিষয়টি যেমন বর্ণিত হয় না তেমন চরিত্রের ক্ষেত্রে):
স্ট্রিং সোর্স = "غونډې একবার অনুষ্ঠানের আগে অনুষ্ঠান";
int গণনা = উত্স.স্প্লিট (নতুন [] @@@ "@@@"}, স্ট্রিংস্প্লিটঅ্যাপশনস R রিমুভ এম্পটিইন্ট্রি) en দৈর্ঘ্য - 1;

পোস্টারের মূল উত্স মানের ("/ একবার / একবার / এক / সময় /") প্রাকৃতিক সীমানা একটি 'চার' / এবং প্রতিক্রিয়াগুলি উত্স ব্যাখ্যা করে .স্প্লিট (চর []) বিকল্পটি যদিও ...


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