আমি কীভাবে একটি নেট স্ট্রিং কেটে দেব?


406

আমি একটি স্ট্রিং এমনভাবে কাটাতে চাই যে এর দৈর্ঘ্য প্রদত্ত মানের চেয়ে বেশি নয়। আমি একটি ডাটাবেস টেবিলে লিখছি এবং আমি যে মানগুলি লিখি তা কলামের ডেটাটাইপের সীমাবদ্ধতার সাথে মেলে তা নিশ্চিত করতে চাই।

উদাহরণস্বরূপ, আমি নিচেরটি লিখতে পারলে ভাল লাগবে:

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}

দুর্ভাগ্যক্রমে, এটি একটি ব্যতিক্রম উত্থাপন করে কারণ maxLengthসাধারণত স্ট্রিংয়ের সীমানা ছাড়িয়ে যায় value। অবশ্যই, আমি নিম্নলিখিতগুলির মতো একটি ফাংশন লিখতে পারি, তবে আমি আশা করছিলাম যে এরকম কিছু ইতিমধ্যে বিদ্যমান।

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 

এই কাজটি সম্পাদনকারী অধরা API কোথায়? একটি আছে?


24
রেকর্ডের জন্য, স্ট্রিংগুলি পরিবর্তনযোগ্য নয় আপনি সেগুলি কেটে ফেলতে পারবেন না কেবল সেগুলির একটি ছাঁটাই অনুলিপি দিতে পারেন। নিতপিকি, আমি জানি।
জন ওয়েলডন

2
@ জন ওয়েলডন: এ কারণেই সম্ভবত সদস্য ফাংশনটি বিদ্যমান নেই - এটি ডেটাটাইপের শব্দার্থবিজ্ঞান অনুসরণ করে না। পার্শ্ব নোটে, StringBuilderদৈর্ঘ্যকে ছোট করে আপনি কেটে ফেলতে পারবেন, তবে স্ট্রিং প্রশস্ত করতে এড়াতে আপনাকে দৈর্ঘ্য পরীক্ষা করতে হবে।
স্টিভ গুইদি

1
আপনি যে কোনও সমাধান গ্রহণ করুন না কেন সাবস্ট্রিংকে কল করার বা দৈর্ঘ্যের সম্পত্তি অ্যাক্সেস করার আগে নাল স্ট্রিংয়ের জন্য একটি চেক যোগ করার বিষয়টি নিশ্চিত হন।
রায়

3
@ স্টিভগুইডি - যদি এমনটি ঘটে থাকে তবে ট্রিম বা রিপ্লেস এর মতো কাজ হত না, যা একই রকমের সিনটেমিক সমস্যার মুখোমুখি হয়
ক্রিস রজার্স

1
@ জোহান ওয়েল্ডন মাইক্রোসফ্টের চেয়ে নিজেরাই নিটপিকির মতো ধারাবাহিকভাবে হ'ল যেমনটি ঘটে - তারা নথিতে খুশি হন, উদাহরণস্বরূপ, .Trim()এটি এমন একটি পদ্ধতিতে যা স্ট্রিংকে রূপান্তরিত করে এমনভাবে বিভ্রান্তিমূলকভাবে শোনায়: "সমস্ত স্থান থেকে শীর্ষস্থানীয় এবং অনুসরণকারী শ্বেত-স্থানের অক্ষর সরিয়ে দেয় বর্তমান স্ট্রিং অবজেক্ট। "
মার্ক অ্যামেরি

উত্তর:


620

Truncate()দুর্ভাগ্যক্রমে, স্ট্রিংয়ের কোনও পদ্ধতি নেই। আপনাকে এ জাতীয় যুক্তি নিজেই লিখতে হবে। আপনি যা করতে পারেন তা হ'ল এটি একটি এক্সটেনশন পদ্ধতিতে মোড়ানো হয় যাতে আপনার এটি সর্বত্র নকল করতে হবে না:

public static class StringExt
{
    public static string Truncate(this string value, int maxLength)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Length <= maxLength ? value : value.Substring(0, maxLength); 
    }
}

এখন আমরা লিখতে পারি:

var someString = "...";
someString = someString.Truncate(2);

5
দুর্দান্ত সমাধান, তবে এটি কেবল নেট 3.5 এবং উপরের কাজ করে in নেট 2.0 এ এটি ব্যবহার করে দেখুন না।
জেদী মাস্টার স্পোকি

7
যতক্ষণ আপনি ভিএস ২০০৮, এবং সম্ভবত ভিএস ২০১০ এ আছেন, আপনি এখনও লক্ষ্য করেও এটি করতে পারতেন। নেট 2.0। danielmoth.com/Blog/…
চিহ্নিত করুন Mark

4
Fail maxLengthণাত্মক মান হলে এটি ব্যর্থ হবে ।
বার্নার্ড

42
@ বার্নার্ড, সর্বোচ্চ দৈর্ঘ্য নেতিবাচক হলে এটি ব্যর্থ হওয়ার কথা। অন্য কোনও আচরণ অপ্রত্যাশিত হবে।
বোজিংগো

12
নাল মানগুলিতে আপনি এক্সটেনশন পদ্ধতিগুলি কল করতে পারেন।
জোয়েল ম্যালোন

127

বা টার্নারি অপারেটরের পরিবর্তে, আপনি ম্যাথ.মিন ব্যবহার করতে পারেন

public static class StringExt
{
    public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return value.Substring(0, Math.Min(value.Length, maxLength));
    }
}

10
চতুর! এবং নিম্নলিখিত অভিব্যক্তি মূল স্ট্রিং একটি রেফারেন্স ফেরত দিতে অপ্টিমাইজ করা হয়: value.Substring(0, value.Length)
স্টিভ গুইদি

4
দুর্ভাগ্যক্রমে এটি এমন ক্ষেত্রে অপেক্ষাকৃত অনুকূল নয় value যেখানে লম্বা ম্যাক্সেলংথের চেয়ে কম, যা কিছু ডেটাতে সাধারণ ঘটনা হতে পারে। এছাড়াও স্ট্রিংয়ের দৈর্ঘ্যের সম্পত্তিটিকে মূলধন করা উচিত।
jpierson

1
Fail maxLengthণাত্মক মান হলে এটি ব্যর্থ হবে ।
বার্নার্ড

7
@ বার্নার্ড, ফ্রেমওয়ার্কেও অনেক কিছু থাকবে ... তবে যদি আমি এটি পরীক্ষা করে দেখি ... আমাকে হয় ডিফল্ট maxLengthকরতে হবে 0বা value.Length; বা আমাকে একটি নিক্ষেপ করা দরকার ArgumentOutOfRangeException... যা এই ক্ষেত্রে আরও বোধগম্য হয় এবং ইতিমধ্যে Substringকোনওভাবেই নিক্ষিপ্ত ।
ক্যাফগিকে

2
কিছুটা সংক্ষিপ্ত:return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
ব্যবহারকারী 01127860

43

আমি অনুভব করেছি যে আমি আমার বাস্তবায়নটি ছুঁড়ে দেব কারণ আমি বিশ্বাস করি যে এটি যে সমস্ত ক্ষেত্রে অন্যদের দ্বারা স্পর্শ করা হয়েছে এবং এটি সংক্ষিপ্ত উপায়ে এটি এখনও পাঠযোগ্য covers

public static string Truncate(this string value, int maxLength)
{
    if (!string.IsNullOrEmpty(value) && value.Length > maxLength)
    {
        return value.Substring(0, maxLength);
    }

    return value;
}

এই সমাধান প্রধানত উপর তৈরী করে রায়ের সমাধান এবং ব্যবহার করে একটি এক্সটেনশন পদ্ধতি হিসাবে ব্যবহারের জন্য পদ্ধতি খুলে এই শব্দ ঠিক যেমন LBushkin করে তার সমাধান।


Fail maxLengthণাত্মক মান হলে এটি ব্যর্থ হবে ।
বার্নার্ড

15
@ বার্নার্ড - আমি সর্বোচ্চ দৈর্ঘ্যের যুক্তির জন্য একটি নেতিবাচক মানটি পাস না করার পরামর্শ দেব কারণ এটি একটি অপ্রত্যাশিত মান। সাবস্ট্রিং পদ্ধতি একই পন্থা নেয় তাই এটি ছুঁড়ে দেওয়া ব্যতিক্রমের উন্নতি করার কোনও কারণ নেই।
jpierson

আমি মনে করি না ইসনুলআরএম্পটি চেকটি প্রয়োজনীয়? (1) মানটি যদি নাল হয়, তবে এটিতে এই এক্সটেনশন পদ্ধতিটি কল করার কোনও উপায় থাকা উচিত নয়। (২) মানটি যদি খালি স্ট্রিং হয় তবে মান L দৈর্ঘ্য> সর্বোচ্চ দৈর্ঘ্য চেক ব্যর্থ হবে।
জন স্নাইডার

8
@ জোনস্কিনিডার, ইসনুলআরএম্পটি প্রয়োজনীয় কারণ এটি একটি এক্সটেনশন পদ্ধতি। যদি আপনার কাছে টাইপ স্ট্রিংয়ের একটি ভেরিয়েবল থাকে যা নাল বরাদ্দ করা হয়েছে, কম্পাইলার এই পদ্ধতিটি কল করার আগে নাল চেক সন্নিবেশ করায় না। প্রযুক্তিগতভাবে, এটি এখনও স্থির শ্রেণির একটি স্থির পদ্ধতি। সুতরাং: স্ট্রিংভার.ট্রানকেট (2) এরূপ সংকলন: স্ট্রিংএকস.ট্রন্ট (স্ট্রিংভার, 2);
জেফ বি

40

কারণ পারফরম্যান্স টেস্টিং মজাদার: ( লিনকপ্যাড এক্সটেনশন পদ্ধতি ব্যবহার করে )

var val = string.Concat(Enumerable.Range(0, 50).Select(i => i % 10));

foreach(var limit in new[] { 10, 25, 44, 64 })
    new Perf<string> {
        { "newstring" + limit, n => new string(val.Take(limit).ToArray()) },
        { "concat" + limit, n => string.Concat(val.Take(limit)) },
        { "truncate" + limit, n => val.Substring(0, Math.Min(val.Length, limit)) },
        { "smart-trunc" + limit, n => val.Length <= limit ? val : val.Substring(0, limit) },
        { "stringbuilder" + limit, n => new StringBuilder(val, 0, Math.Min(val.Length, limit), limit).ToString() },
    }.Vs();

truncateপদ্ধতি "উল্লেখযোগ্যভাবে" দ্রুত ছিল। #microoptimization

গোড়ার দিকে

  • ট্রানকেট 10 5788 টিকগুলি বিচ্ছিন্ন হয়েছে (0.5788 এমএস) [10 কে রেপিতে, 5.788E-05 এমএস প্রতি]
  • স্মার্ট-ট্রাঙ্ক 1010 8206 টিকগুলি কেটে গেছে (0.8206 এমএস) [10 কে রেপিতে, 8.206E-05 এমএস প্রতি]
  • স্ট্রিংবিল্ডার 10 10557 টিটিকগুলি কেটে গেছে (1.0557 এমএস) [10 কে রেপিতে, 0.00010557 এমএস প্রতি]
  • কনক্যাট 10 45495 টিক্স বিচ্ছিন্ন হয়েছে (4.5495 এমএস) [10 কে রেপিতে, 0.00045495 এমএস প্রতি]
  • newstring10 72535 টিকগুলি বিচ্ছিন্ন হয়েছে (7.2535 এমএস) [10 কে রেপিতে, 0.00072535 এমএস প্রতি]

বিলম্বে

  • কাটা কাটা 444435 টিকগুলি বিচ্ছিন্ন হয়েছে (0.8835 এমএস) [10 কে রেপিতে, 8.835E-05 এমএস প্রতি]
  • স্ট্রিংবিল্ডার 4413106 টিক্স কেটে গেছে (1.3106 এমএস) [10 কে রেপিতে, 0.00013106 এমএস প্রতি]
  • স্মার্ট-ট্রাঙ্ক 44448 টিটিকগুলি কেটে গেছে (1.4821 এমএস) [10 কে রেপিতে, 0.00014821 এমএস প্রতি]
  • newstring44 144324 টিকগুলি কেটে গেছে (14.4324 এমএস) [10 কে রেপিতে, 0.00144324 এমএস প্রতি]
  • কনক্যাট 444 174610 টিকগুলি বিচ্ছিন্ন হয়েছে (17.461 এমএস) [10 কে রেপিতে, 0.0017461 এমএস প্রতি]

অনেক দেরি

  • স্মার্ট-ট্র্যাঙ্ক 64৯৪৪ টি টিক্স কেটে গেছে (0.6944 এমএস) [10 কে রেপিতে, 6.944E-05 এমএস প্রতি]
  • কাটা কাটা 647686 টিকগুলি বিভক্ত (0.7686 এমএস) [10 কে রেপিতে, 7.686E-05 এমএস প্রতি]
  • স্ট্রিংউইল্ডার 13314 টিকগুলি কেটে গেছে (1.3314 এমএস) [10 কে রেপিতে, 0.00013314 এমএস প্রতি]
  • newstring64 177481 টিক্স কেটে গেছে (17.7481 এমএস) [10 কে রেপিতে, 0.00177481 এমএস প্রতি]
  • কনক্যাটট 64 241601 টিকগুলি বিভক্ত (24.1601 এমএস) [10 কে রেপিতে, 0.00241601 এমএস প্রতি]

সমস্ত দরকারী মানদণ্ডের জন্য ধন্যবাদ! ... এবং লিংকপ্যাড শিলা!
সানসেটকুয়েস্ট

লিঙ্কপ্যাড এই জিনিসগুলি করতে পারে তা কখনই মনে করবেন না
jefissu

38

নেট 4.0 এ আপনি Takeপদ্ধতিটি ব্যবহার করতে পারেন :

string.Concat(myString.Take(maxLength));

দক্ষতার জন্য পরীক্ষা করা হয়নি!


27

আপনি লিনকুই ব্যবহার করতে পারেন ... এটি স্ট্রিংয়ের দৈর্ঘ্য যাচাই করার প্রয়োজনকে দূর করে। স্বীকার করা সম্ভবত সবচেয়ে দক্ষ না হলেও এটি মজাদার।

string result = string.Join("", value.Take(maxLength)); // .NET 4 Join

অথবা

string result = new string(value.Take(maxLength).ToArray());

2
কেন এটি গৃহীত উত্তর নয়? সর্বাধিক সোজা কী, আপনার নিজস্ব এক্সটেনশন পদ্ধতিটি লিখুন যা আপনার / ডকুমেন্ট বজায় রাখতে হবে, বা এমন কিছু ব্যবহার করতে চাই T
ডন জন্য Cheadle

9
@ মিমক্রাই লিনক আরও সোজা এগিয়ে হতে পারে তবে এটি অনেক ধীর গতিতে। আমার মানদণ্ডটি লিঙ্কের জন্য ms 400ms এবং 1 মিলিয়ন পুনরাবৃত্তির জন্য সাবস্ট্রিংয়ের জন্য কেবল 24 ডলার says
হেইন আন্দ্রে গ্রাননেস্টাড

এই সমাধানটি কখনও ব্যবহার করা উচিত নয়। উপরোক্ত দুটি মন্তব্যে যেমন বলা হয়েছে, উপস্থিত স্ট্রিং সর্বাধিক দৈর্ঘ্যের চেয়ে বড় না হয়েও সর্বদা মেমরি বরাদ্দ থাকে। এছাড়াও এটি খুব ধীর।
কামারে

15

আমি এই মত একটি লাইনে আমার কাজ

value = value.Length > 1000 ? value.Substring(0, 1000) : value;

2
-1; এটি এমন কোনও কিছুই যুক্ত করে না যা ইতিমধ্যে গৃহীত উত্তরের মধ্যে ছিল না।
মার্ক আমেরিকা

2
@ মার্কেরি এটি লিখতে এবং আপডেট করার জন্য কম কোড সহ একটি সংক্ষিপ্ত বিকল্প যখন আপনার এটির প্রয়োজন হয়। ভাল লাগে না? এটি ব্যবহার করবেন না
SeanMC

দ্রুত, সহজ এবং দ্রুত এই আমার প্রয়োজন ছিল। ধন্যবাদ!
পিটার

14

দেখে মনে হচ্ছে কেউ এই পোস্ট করেন নি:

public static class StringExt
{
    public static string Truncate(this string s, int maxLength)
    {
        return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s;
    }
}

&& অপারেটর ব্যবহার করা স্বীকৃত উত্তরের চেয়ে সামান্যতর উন্নত করে।


13

.NET ফ্রেমওয়ার্কটির মতো একটি স্ট্রিং কেটে দেওয়ার জন্য একটি এপিআই রয়েছে:

Microsoft.VisualBasic.Strings.Left(string, int);

তবে একটি সি # অ্যাপে আপনি সম্ভবত মাইক্রোসফ্টের উপর নির্ভরতা নেওয়ার চেয়ে নিজেকে রোল করতে পছন্দ করবেন is ভিজুয়ালবাসিক.ডিল, যার মূল রেসন ডি'ট্রে পিছনের দিকের সামঞ্জস্য is


".NET ফ্রেমওয়ার্কের একটি এপিআই রয়েছে" আপনি নিজের সাথে বিরোধিতা করছেন। এটি একটি
ভিবি.এনইটি

9
@ ক্যামিলো টেরেভিন্টো - এটি এমন একটি এপিআই যা। নেট ফ্রেমওয়ার্ক সহ প্রেরণ করা হয় এবং যে কোনও পরিচালিত ভাষা থেকে ফোন করা যায়।
জো

1
ভিবি ডিএলএলে এতে প্রচুর ভাল স্টাফ রয়েছে। কেন এতগুলি সি # ডেভস এর বিরুদ্ধে?
মাইকেল জেড।

দুর্ভাগ্যক্রমে বর্তমানে .NET কোর সমর্থন নেই। প্রকৃতপক্ষে Microsoft.VisualBasic.Strings। নেট কোর পুরো মডিউলগুলি বেশ ফাঁকা
মার্ক আমেরিকা

1
আমি জো মন্তব্যের সাথে একমত হওয়ার পরেও অন্য ভাষাগুলির ভিবি-র জন্য নির্দিষ্ট কিছুকে কল করা ঠিক বোধ করি না। যদি "ভিবি ডিএলএল" তে এত ভাল জিনিস থাকে তবে কেন এটিকে কিছু ভাগ করে নেওয়া যায় না? মাইক্রোসফ্ট আগামীকাল এই জিনিসগুলির সাথে কী করবে কে জানে? সমর্থন বা কিছু বন্ধ করুন ..
কামারে


6

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এখানে একটি দুর্দান্ত সমাধান রয়েছে:

public static string Truncate(this string text, int maxLength, string suffix = "...")
{
    string str = text;
    if (maxLength > 0)
    {
        int length = maxLength - suffix.Length;
        if (length <= 0)
        {
            return str;
        }
        if ((text != null) && (text.Length > maxLength))
        {
            return (text.Substring(0, length).TrimEnd(new char[0]) + suffix);
        }
    }
    return str;
}

var myString = "hello world"
var myTruncatedString = myString.Truncate(4);

রিটার্নস: হ্যালো ...


@ সরজন ওয়েলদেব সেই বিশেষ চরিত্রটি "হিসাবে প্রদর্শিত হবে"। cmd.exe মধ্যে
নীল Ehardt

5

সি # 6 এর নল প্রচার প্রচারকারী অপারেটরের সাথে একই রকম বৈকল্পিক

public static string Truncate(this string value, int maxLength)
{
    return value?.Length <= maxLength ? value : value?.Substring(0, maxLength);
}

দয়া করে মনে রাখবেন, আমরা valueএখানে দু'বার নাল হয় কিনা তা মূলত যাচাই করে দেখছি ।


5

সি # স্ট্রিংয়ের জন্য এখনও 2016 সালে কোনও ট্রান্সকেট পদ্ধতি নেই। তবে - সি # 6.0 সিনট্যাক্স ব্যবহার করে:

public static class StringExtension
{
  public static string Truncate(this string s, int max) 
  { 
    return s?.Length > max ? s.Substring(0, max) : s ?? throw new ArgumentNullException(s); 
  }
}

এটি যাদুমন্ত্রের মত কাজ করে:

"Truncate me".Truncate(8);
Result: "Truncate"

4

@ ক্যাফগিকে নেওয়া এবং এটি সরলকরণ:

public static string Truncate(this string value, int maxLength)
    {
        return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
    }

4

বিনীতভাবে নোট করুন যে একটি স্ট্রিং কেটে দেওয়ার অর্থ কেবল একটি নির্দিষ্ট দৈর্ঘ্যে স্ট্রিং কাটানো নয়, শব্দটি বিভক্ত না হওয়ার জন্য যত্ন নিতে হবে।

যেমন স্ট্রিং: এটি একটি পরীক্ষার স্ট্রিং।

আমি 11 এ এটি কাটাতে চান। উপরে বর্ণিত যেকোন পদ্ধতি ব্যবহার করলে ফলাফল হবে

এটি একটি তে

এটি আমরা চাই জিনিস নয়

আমি যে পদ্ধতিটি ব্যবহার করছি সেটিও এতটা নিখুঁত নয় তবে এটি বেশিরভাগ পরিস্থিতি পরিচালনা করতে পারে

public string CutString(string source, int length)
{
        if (source== null || source.Length < length)
        {
            return source;
        }
        int nextSpace = source.LastIndexOf(" ", length);
        return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
} 

4

কেন না:

string NormalizeLength(string value, int maxLength)
{
    //check String.IsNullOrEmpty(value) and act on it. 
    return value.PadRight(maxLength).Substring(0, maxLength);
}

অর্থাত্ ইভেন্টের value.Length < maxLengthপ্যাড স্পেসে শেষ পর্যন্ত বা অতিরিক্ত কেটে ফেলুন।


আপনি দ্বিগুণ স্ট্রিং অবজেক্ট তৈরি করেন এবং প্যাডরাইট কল থেকে এটি একটি নুলারফেরান এক্সেক্সশন ফেলে দিতে পারে যদি মানটি শূন্য হয় যা অনুপযুক্ত, এটি একটি আর্গুমেন্টনাল এক্সসেপশন হওয়া উচিত।
জেরেমি

1
@ জেরেমি আমি বুঝতে পারছি না "যদি মূল্য বাতিল হয় তবে প্যাডরাইট কলটি থেকে এটি নুলারফেরান এক্সেক্সশন ফেলে দিতে পারে"; আমি কি "// চেক স্ট্রিংয়ের কথা উল্লেখ করি নি .sNullOrEmpty (মান) এবং এতে কাজ করব।"
শ্রী

3

এখানে পর্যাপ্ত উত্তর না থাকলে কেবল আমার এখানে :)

public static string Truncate(this string str, 
                              int totalLength, 
                              string truncationIndicator = "")
{
    if (string.IsNullOrEmpty(str) || str.Length < totalLength) 
        return str;

    return str.Substring(0, totalLength - truncationIndicator.Length) 
           + truncationIndicator;
}

ব্যবহার করা:

"I use it like this".Truncate(5,"~")

2

(ওভার) জটিলতার স্বার্থে আমি আমার ওভারলোডেড সংস্করণ যুক্ত করব যা সর্বশেষ 3 টি অক্ষরকে একটি এললিপিসিসের সাথে সর্বাধিক দৈর্ঘ্যের প্যারামিটারের সাথে প্রতিস্থাপন করে।

public static string Truncate(this string value, int maxLength, bool replaceTruncatedCharWithEllipsis = false)
{
    if (replaceTruncatedCharWithEllipsis && maxLength <= 3)
        throw new ArgumentOutOfRangeException("maxLength",
            "maxLength should be greater than three when replacing with an ellipsis.");

    if (String.IsNullOrWhiteSpace(value)) 
        return String.Empty;

    if (replaceTruncatedCharWithEllipsis &&
        value.Length > maxLength)
    {
        return value.Substring(0, maxLength - 3) + "...";
    }

    return value.Substring(0, Math.Min(value.Length, maxLength)); 
}


1

আমি jpierson এর উত্তর পছন্দ করি, তবে এখানে যে উদাহরণগুলি আমি দেখতে পাচ্ছি তার মধ্যে কোনওটিই একটি অবৈধ ম্যাক্সেলেন্থ পরামিতি পরিচালনা করছে না, যেমন কখন সর্বোচ্চ দৈর্ঘ্য <0।

পছন্দগুলি হয় চেষ্টা করে / ধরার ক্ষেত্রে ত্রুটিটি পরিচালনা করে, সর্বোচ্চ দৈর্ঘ্য প্যারামিটারটি মিনিটে 0 থেকে বাতাতে বা ম্যাক্সেলেন্থ 0 এর চেয়ে কম হলে একটি খালি স্ট্রিং ফেরত দেয়।

অপ্টিমাইজড কোড নয়:

public string Truncate(this string value, int maximumLength)
{
    if (string.IsNullOrEmpty(value) == true) { return value; }
    if (maximumLen < 0) { return String.Empty; }
    if (value.Length > maximumLength) { return value.Substring(0, maximumLength); }
    return value;
}

3
দ্রষ্টব্য, যে আমার বাস্তবায়নে আমি সর্বাধিক দৈর্ঘ্য 0-এর কম হ'ল কেসটি পরিচালনা করতে পছন্দ করি না কারণ আমি কেবলমাত্র একটি কাজটিই অনুভব করলাম তা হল একটি আর্গুমেন্টআউটঅফরাঞ্জএক্সসিপশন নিক্ষেপ করা যা স্ট্রিং.সুবস্ট্রিং () আমার পক্ষে কী করে।
jpierson

1

এখানে একটি vb.net সমাধান রয়েছে, চিহ্নিত করুন যে যদি (যদিও কুৎসিত) স্টেটমেন্টটি পারফরম্যান্স উন্নত করে কারণ স্ট্রিং ইতিমধ্যে সর্বোচ্চের চেয়ে ছোট যখন স্ট্রিং স্টেটমেন্টের প্রয়োজন হয় না ... স্ট্রিংয়ের প্রতিরোধের দ্বারা এটি ব্যবহার করা সহজ। ..

 <System.Runtime.CompilerServices.Extension()> _
    Public Function Truncate(String__1 As String, maxlength As Integer) As String
        If Not String.IsNullOrEmpty(String__1) AndAlso String__1.Length > maxlength Then
            Return String__1.Substring(0, maxlength)
        Else
            Return String__1
        End If
    End Function

ভিবি.নেটে আপনি "স্ট্রিং_আইএসনুলআরএম্পটি (স্ট্রিং__1)" "স্ট্রিং__1 <> কিছুই না" এর সাথে প্রতিস্থাপন করতে পারেন। এটা একটু খাটো। স্ট্রিংয়ের জন্য ডিফল্ট মান হ'ল একটি খালি স্ট্রিং। "<> কিছুই না" ব্যবহার করে নাল এবং খালি স্ট্রিং উভয় ক্ষেত্রেই পরীক্ষা করা হয়। এটি দিয়ে পরীক্ষা করুন: ট্র্যাঙ্কেট ("", 50) এবং
ট্রুঙ্কেট

ভিবিতে আপনি বাম (স্ট্রিং, সর্বাধিক দৈর্ঘ্য) করতে পারেন
মাইকেল জেড।

1

আমি জানি যে এরই মধ্যে একটি টন উত্তর রয়েছে তবে আমার প্রয়োজন ছিল স্ট্রিংয়ের শুরু এবং শেষ অক্ষত রাখা কিন্তু এটি সর্বোচ্চ দৈর্ঘ্যের নীচে ছোট করা উচিত।

    public static string TruncateMiddle(string source)
    {
        if (String.IsNullOrWhiteSpace(source) || source.Length < 260) 
            return source;

        return string.Format("{0}...{1}", 
            source.Substring(0, 235),
            source.Substring(source.Length - 20));
    }

এটি শেয়ারপয়েন্ট ইউআরএলগুলি তৈরি করার জন্য যার সর্বাধিক দৈর্ঘ্যের 260 টি অক্ষর রয়েছে।

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

এটি সহজেই আপনার নির্দিষ্ট প্রয়োজনের সাথে খাপ খাইয়ে নিতে পারে।


1

আমি জানি এখানে ইতিমধ্যে অনেকগুলি উত্তর রয়েছে, তবে এটিই আমি নিয়ে গিয়েছিলাম, যা নাল স্ট্রিং এবং দৈর্ঘ্যটি যে অবস্থায় পড়েছিল তা উভয়ই পরিচালনা করে:

public static string Truncate(this string s, int length)
{
    return string.IsNullOrEmpty(s) || s.Length <= length ? s 
        : length <= 0 ? string.Empty 
        : s.Substring(0, length);
}

1

সি # 8 এ নতুন রেঞ্জ বৈশিষ্ট্য ব্যবহার করা যেতে পারে ...

value = value[..Math.Min(30, value.Length)];

0

এর জন্য। নেট-তে কিছুই নেই যা আমি সচেতন - এখানে আমার সংস্করণ যা "..." যুক্ত করে:

public static string truncateString(string originalString, int length) {
  if (string.IsNullOrEmpty(originalString)) {
   return originalString;
  }
  if (originalString.Length > length) {
   return originalString.Substring(0, length) + "...";
  }
  else {
   return originalString;
  }
}

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

0

TruncateString

public static string _TruncateString(string input, int charaterlimit)
{
    int characterLimit = charaterlimit;
    string output = input;

    // Check if the string is longer than the allowed amount
    // otherwise do nothing
    if (output.Length > characterLimit && characterLimit > 0)
    {
        // cut the string down to the maximum number of characters
        output = output.Substring(0, characterLimit);
        // Check if the character right after the truncate point was a space
        // if not, we are in the middle of a word and need to remove the rest of it
        if (input.Substring(output.Length, 1) != " ")
        {
            int LastSpace = output.LastIndexOf(" ");

            // if we found a space then, cut back to that space
            if (LastSpace != -1)
            {
                output = output.Substring(0, LastSpace);
            }
        }
        // Finally, add the "..."
        output += "...";
    }
    return output;
}

2
আপনি কেন আপনার জনসাধারণের পদ্ধতির নামটিকে আন্ডারস্কোর দিয়ে আগে রেখেছেন?
মাইকেল জেড।

0

উপরে আলোচিত সম্ভাবনার সংযোজন হিসাবে আমি আমার সমাধানটি ভাগ করতে চাই। এটি একটি এক্সটেনশান পদ্ধতি যা নালকে (স্ট্রিং প্রদান করে mp ইমপিটি) অনুমতি দেয় এছাড়াও একটি দ্বিতীয় রয়েছে। সাবধান, এটি পারফরম্যান্স অনুকূল নয়।

public static string Truncate(this string value, int maxLength) =>
    (value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
    string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);

-1
public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return new string(value.Take(maxLength).ToArray());// use LINQ and be happy
    }

এখানে ToArray()কলটি কেবল অপ্রয়োজনীয় ওভারহেড; উদাহরণস্বরূপ ব্যবহার করে String.Concatআপনি একটি অ্যারের মধ্য দিয়ে না গিয়েই একটি অসংখ্য অঙ্কের অক্ষর থেকে একটি স্ট্রিং তৈরি করতে পারেন।
মার্ক আমেরিকা

-3

স্ট্রিং কেটে ফেলুন

public static string TruncateText(string strText, int intLength)
{
    if (!(string.IsNullOrEmpty(strText)))
    {                                
        // split the text.
        var words = strText.Split(' ');

        // calculate the number of words
        // based on the provided characters length 
        // use an average of 7.6 chars per word.
        int wordLength = Convert.ToInt32(Math.Ceiling(intLength / 7.6));

        // if the text is shorter than the length,
        // display the text without changing it.
        if (words.Length <= wordLength)
            return strText.Trim();                

        // put together a shorter text
        // based on the number of words
        return string.Join(" ", words.Take(wordLength)) + " ...".Trim();
    }
        else
        {
            return "";
        }            
    }

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

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

-4

এই কোডটি আমি সাধারণত ব্যবহার করি:

string getSubString(string value, int index, int length)
        {
            if (string.IsNullOrEmpty(value) || value.Length <= length)
            {
                return value;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = index; i < length; i++)
            {
                sb.AppendLine(value[i].ToString());
            }
            return sb.ToString();
        }

5
অনুগ্রহ করে নোট করুন যে + = দিয়ে কনক্রিট্যান্টিং স্ট্রিংগুলি একটি ব্যয়বহুল ক্রিয়াকলাপ, বিশেষত চরিত্র অনুসারে চরিত্রটি পুনর্নির্মাণের সময়। .NET স্ট্রিংগুলি পরিবর্তনযোগ্য নয়, যার অর্থ এই ক্ষেত্রে, আপনার লুপে প্রতিবার একটি নতুন স্ট্রিং তৈরি হয়।
স্টিভ গুইদি

@ স্টেভগুইডি স্ট্রিংগুলি পরিবর্তনযোগ্য নয়, তারা কেবল অপরিবর্তনীয় হিসাবে মুখোশ দেয়। আমি চাই যে স্ট্রিংগুলি সত্যিকারের অপরিবর্তনীয় আদিম ছিল তাই আমার কাছে স্ট্রিং এবং স্ট্রিং থাকতে পারে ?, হায় আফসোস তারা আদিম নয়।
ক্রিস মেরিসিক

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