যদি আমার স্ট্রিংগুলি খুব দীর্ঘ হয় তবে আমি কীভাবে তাদের কেটে ফেলতে পারি?


84

আশা করি কারও ভাল ধারণা আছে। আমার কাছে স্ট্রিং রয়েছে:

abcdefg
abcde
abc

আমার যা প্রয়োজন তা হ'ল তাদের নির্দিষ্ট ধরণের দৈর্ঘ্যের চেয়ে বেশি হলে এ জাতীয় দেখানোর জন্য ট্রুকিট করা হবে:

abc ..
abc ..
abc

আমি কি এর জন্য কোনও সাধারণ সি # কোড ব্যবহার করতে পারি?


আপনি কোথায় এটি করতে খুঁজছেন? - একটি ফর্ম বা ডাব্লুপিএফ অ্যাপ্লিকেশন বা কোনও ওয়েবসাইটে - দয়া করে আরও বিশদ সরবরাহ করুন!
ব্যারি কায়ে

4
বেশিরভাগ সমাধানের সমস্যা হ'ল তারা Charসীমা হিসাবে অনেকগুলি ব্যবহার করে । দুর্ভাগ্যক্রমে গ্রাফিকাল প্রস্থ অনেক বড় হতে পারে। এবং তারপরে রয়েছে ইউটিএফ -16
সার্গেটস

12
এটি প্রস্তাবিত প্রশ্নের সদৃশ নয়। এটি অত্যন্ত সাধারণ প্রশ্ন, যখন প্রস্তাবিত সদৃশটি একটি অত্যন্ত নির্দিষ্ট প্রশ্ন।
জেসনমারচার

4
এটি একেবারে প্রস্তাবিত প্রশ্নের সদৃশ নয়।
শেঠ

4
এই প্রশ্নটি প্রস্তাবিত সদৃশটির নিকটেও নয়, দয়া করে সদৃশ বৈশিষ্ট্যটি সরান। ধন্যবাদ.
ড্যানিয়েল লইজেন

উত্তর:


147

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

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

ব্যবহার:

var s = "abcdefg";

Console.WriteLine(s.Truncate(3));

4
ধন্যবাদ ব্রায়ান আপনার উত্তরটি ভাল দেখাচ্ছে। দয়া করে আমার সাধারণ প্রশ্নটি ক্ষমা করুন তবে আমি কীভাবে একটি এক্সটেনশন পদ্ধতি ব্যবহার করব?
মেলনি

4
@ মেলনি: ব্যবহার অন্তর্ভুক্ত করার জন্য সম্পাদিত।
ব্রায়ান ওয়াটস

11
… (উপবৃত্তাকার) হ'ল যারা যত্নশীল তাদের জন্য সঠিক প্রতীক। ইউনিকোড ইউ + 2026।
মালাকো

4
একটি নাল চেক অন্তর্ভুক্ত করার জন্য দ্রুত সংযোজন
জেমস

4
ধন্যবাদ @ মালাকো: value.Substring(0, maxChars) + (char)0x2026;
পিয়েরে

8
public string TruncString(string myStr, int THRESHOLD)
{
    if (myStr.Length > THRESHOLD)
        return myStr.Substring(0, THRESHOLD) + "...";
    return myStr;
}

নামকরণের কনভেনশনটি উপেক্ষা করুন ঠিক সে ক্ষেত্রে যদি তার আসলে তিনটি শর্ট ভেরিয়েবলের প্রয়োজন হয় বা যদি এটি সর্বদা একই আকার হয়।

বিকল্পভাবে

string res = (myStr.Length > THRESHOLD) ? myStr.Substring(0, THRESHOLD) + ".." : myStr;

আমি এক লাইনের সাথে এমন কিছু তৈরি করা সম্ভব যা আমি ইনলাইন ব্যবহার করতে পারি?
মেলনি


8

সমস্ত খুব ভাল উত্তর, তবে এটি কিছুটা পরিষ্কার করার জন্য, যদি আপনার স্ট্রিং বাক্য হয়, তবে কোনও শব্দটির মাঝখানে আপনার স্ট্রিংটি ভাঙ্গবেন না।

private string TruncateForDisplay(this string value, int length)
{
  if (string.IsNullOrEmpty(value)) return string.Empty;
  var returnValue = value;
  if (value.Length > length)
  {
    var tmp = value.Substring(0, length) ;
    if (tmp.LastIndexOf(' ') > 0)
       returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}

এটি কেবলমাত্র উত্তর যা শব্দ ভাঙে না। সুতরাং একমাত্র সঠিক আইএমও।
mxmissile

@ এমএক্সমিসিল - ওপি ডেটা দেওয়া হয়েছে, "অ্যাবসিডিএফজি" এর জন্য, তিনটি অক্ষরে ছাঁটাই করা "অ্যাবিসি ..." এ যায়, এমনকি যদি এটি কাজ করে তবে এটি মোটেও সঠিক হবে না। ওপির নমুনা তথ্য স্পষ্টতই সংলগ্ন পাঠ্যের মাঝখানে একটি শক্ত কাটা কাটা ইঙ্গিত দেয়। সবচেয়ে খারাপ, এটি যেমন রয়েছে, এই উত্তরটি একটি ত্রুটি তৈরি করবে। যেহেতু ডেটাতে কোনও স্থান নেই, তাই LastIndexOfআবার -1 আসবে এবং এটি Substringরানটাইম ত্রুটির কারণ হবে।

4

উপবৃত্তগুলির দৈর্ঘ্যের জন্য দায়ী এমন একটি সংস্করণ এখানে রয়েছে:

    public static string Truncate(this string value, int maxChars)
    {
        const string ellipses = "...";
        return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses;
    }

4
আপনি যদি উপবৃত্তাকার চরিত্রটি ব্যবহার করেন তবে তার দরকার নেই। এর চরিত্রের দৈর্ঘ্য সর্বদা 1const char ellipse = (char)0x2026;
পিয়েরে

3

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

  1. একটি পদ্ধতি তৈরি করুন, সম্ভবত একটি এক্সটেনশন পদ্ধতি public static void TruncateWithEllipsis(this string value, int maxLength)

  2. সম্পত্তিটিmaxLength ব্যবহার করে নির্দিষ্ট করা মানটির চেয়ে বেশি উত্তীর্ণ হয়েছে কিনা তা পরীক্ষা করে দেখুন । এর চেয়ে বড় না হলে কেবল ফিরিয়ে দিন ।LengthvaluemaxLengthvalue

  3. আমরা যদি পাসের মানটিকে যেমনটি ফেরত না দিয়ে থাকি তবে আমরা জানি যে আমাদের কেটে ফেলতে হবে। সুতরাং আমাদের পদ্ধতিটি ব্যবহার করে স্ট্রিংয়ের একটি ছোট্ট বিভাগ পেতে হবেSubString । এই পদ্ধতিটি একটি নির্দিষ্ট শুরু এবং শেষ মানের উপর ভিত্তি করে একটি স্ট্রিংয়ের একটি ছোট বিভাগ ফেরত দেবে। শেষের অবস্থানটি maxLengthপ্যারামিটার দ্বারা পাস করা হয়েছিল তাই এটি ব্যবহার করুন।

  4. স্ট্রিংয়ের উপ-বিভাগটি উপবৃত্তাকার এবং উপবৃত্তাকারটি ফিরে আসুন।

পরবর্তী সময়ের জন্য একটি দুর্দান্ত অনুশীলন হ'ল পদ্ধতিটি আপডেট করা এবং কেবল পুরো শব্দের পরে এটি ভেঙে দেওয়া। আপনি কীভাবে কোনও স্ট্রিংটি কেটে ফেলেছেন তা নির্দিষ্ট করতে একটি ওভারলোড তৈরি করতে পারেন। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি ক্লিক করে আরও বিশদ দেখানোর জন্য সেট আপ করা থাকে তবে পদ্ধতিটি "..." এর পরিবর্তে "(আরও ক্লিক করুন)" ফিরে আসতে পারে।


2

পিছনে কোড:

string shorten(sting s)
{
    //string s = abcdefg;
    int tooLongInt = 3;

    if (s.Length > tooLongInt)
        return s.Substring(0, tooLongInt) + "..";

    return s;
}

মার্কআপ:

<td><%= shorten(YOUR_STRING_HERE) %></td>

আমি এটিকে কীভাবে ফিট করতে পারি: "<td>" + স্ট্রিং + "<\ টিডি>"?
মেলনি

2

সেই উদ্দেশ্যে কোনও পদ্ধতি প্রয়োগ করা আরও ভাল:

string shorten(sting yourStr)
{
//Suppose you have a string yourStr, toView and a constant value 

    string toView;
    const int maxView = 3;

    if (yourStr.Length > maxView)
        toView = yourStr.Substring(0, maxView) + " ..."; // all you have is to use Substring(int, int) .net method
    else
        toView = yourStr;
return toView;
}

1
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

আপনি সাবস্ট্রিং ফাংশনটি ব্যবহার করতে পারেন।


1

"সি # ট্রাঙ্কেট উপবৃত্তাকার" অনুসন্ধানের পরে আমি এই প্রশ্নটি পেয়েছি। বিভিন্ন উত্তর ব্যবহার করে, আমি নিম্নলিখিত বৈশিষ্ট্যগুলি সহ আমার নিজস্ব সমাধান তৈরি করেছি:

  1. একটি এক্সটেনশন পদ্ধতি
  2. একটি উপবৃত্ত যুক্ত করুন
  3. উপবৃত্তিকে alচ্ছিক করুন
  4. শংসাপত্রটি কেটে দেওয়ার চেষ্টা করার আগে স্ট্রিংটি নাল বা ফাঁকা নয় তা যাচাই করুন।

    public static class StringExtensions
    {
        public static string Truncate(this string value, 
            int maxLength, 
            bool addEllipsis = false)
        {
            // Check for valid string before attempting to truncate
            if (string.IsNullOrEmpty(value)) return value;
    
            // Proceed with truncating
            var result = string.Empty;
            if (value.Length > maxLength)
            {
                result = value.Substring(0, maxLength);
                if (addEllipsis) result += "...";
            }
            else
            {
                result = value;
            }
    
            return result;
        }
    }
    

আমি আশা করি এটি অন্য কাউকে সহায়তা করে।



0

আমি সম্প্রতি এই সমস্যা আছে। আমি একটি nvarcharMAX ডিবি ক্ষেত্রে 4000 টি অক্ষরের একটি "স্থিতি" বার্তা সংরক্ষণ করছিলাম। তবে আমার স্থিতি বার্তাগুলি ব্যতিক্রমগুলি আপ করছে।

তবে এটি একটি ছাঁটাই করার সহজ ঘটনা ছিল না কারণ একটি স্বেচ্ছাসেবী কাটা একটি স্থিতি বার্তার অনাথ অংশ হত, সুতরাং স্ট্রিংয়ের একটি ধারাবাহিক অংশে আমার সত্যিই "কাটা" দরকার ছিল।

আমি স্ট্রিংটিকে একটি স্ট্রিং অ্যারে রূপান্তর করে প্রথম উপাদানটি সরিয়ে এবং তারপরে একটি স্ট্রিংয়ে পুনরুদ্ধার করে সমস্যার সমাধান করেছি। এখানে কোড ("কারেন্টস্ট্যাটাস" হ'ল স্ট্রিংটি ডেটা ধারণ করে) ...

        if (CurrentStatus.Length >= 3750)
        {
            // perform some truncation to free up some space.

            // Lets get the status messages into an array for processing...
            // We use the period as the delimiter, then skip the first item and re-insert into an array.

            string[] statusArray = CurrentStatus.Split(new string[] { "." }, StringSplitOptions.None)
                                    .Skip(1).ToArray();

            // Next we return the data to a string and replace any escaped returns with proper one.
            CurrentStatus = (string.Join(".", statusArray))
                                    .Replace("\\r\\n", Environment.NewLine);


        }

আশা করি এটি কাউকে সাহায্য করবে।

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