আমি কীভাবে সি # তে স্ট্রিং থেকে শেষ চারটি অক্ষর পেতে পারি?


309

ধরুন আমার কাছে একটি স্ট্রিং রয়েছে:

"34234234d124"

আমি এই স্ট্রিংয়ের সর্বশেষ চারটি অক্ষর পেতে চাই "d124"। আমি ব্যবহার করতে পারি SubString, তবে এর জন্য কোডের কয়েকটি লাইন দরকার, ভেরিয়েবলের নামকরণ সহ।

সি # এর সাথে একটি অভিব্যক্তিতে এই ফলাফল পাওয়া সম্ভব?


3
4 টির চেয়ে কম অক্ষর থাকলে আপনি কী চান?
এজেন্ট-জে

12
4 > mystring.length ? mystring : mystring.Substring(mystring.length -4);
জোডরেল

3
পাইথন ইন সমাধান খুবই সহজ: "hello world"[-4:]। আমি আশা করি ভবিষ্যতের সি # এর একটি সংস্করণ এটি সহজ করে তুলবে।
কর্নেল আতঙ্ক

@ColonelPanic, এখন C # এর 8.0 সঙ্গে আপনি যা করতে পারেন: "hello world"[^4..]:-)
Frode Evensen

উত্তর:


407
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?

আপনি যদি ইতিবাচক হন তবে আপনার স্ট্রিংয়ের দৈর্ঘ্য কমপক্ষে 4 হয়, তবে এটি আরও খাটো:

mystring.Substring(mystring.Length - 4);

13
এছাড়াও, mystring4 টি অক্ষরের কম দীর্ঘ হলে এটি ব্যর্থ হবে ।
জর্জ ডেকেট

3
+1 কারণ আমি মনে করি আপনার @ dtb এর চেয়ে কিছুটা বেশি পঠনযোগ্য
জর্জ

বেশ কয়েকটি কোডের লাইন নেওয়া (যা ওপি ইতিমধ্যে জানত) এবং এটি একটি লাইনে ক্র্যামিং করা আসলেই একটি এক্সপ্রেশন হিসাবে একই জিনিস নয়।
বুহ বুহ

1
আমি এটা পছন্দ করি. সহজ এবং মার্জিত এবং সর্বাধিক লাগে তাই আপনার স্ট্রিং 0 টিরও কম হলে আপনি সূচী ব্যতিক্রমটি পাবেন না।
ব্রেটিকাস

+1 সরল এবং বিন্দুতে সমস্ত ঘাঁটি কভার করে। স্টেসিয়ার প্রস্তাবিত এক্সটেনশন পদ্ধতিটিও বেশ ভাল, তবে আপনি যদি একবার মাত্র এটি করেন তবে কিছুটা বেশি কিল।
মরভেল

205

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

public static class StringExtension
{
    public static string GetLast(this string source, int tail_length)
    {
       if(tail_length >= source.Length)
          return source;
       return source.Substring(source.Length - tail_length);
    }
}

এবং তারপরে কল করুন:

string mystring = "34234234d124";
string res = mystring.GetLast(4);

11
আমি এটি পছন্দ করি তবে আমি সম্ভবত এটিকে সর্বশেষ () বলি। সর্বোপরি সাবস্ট্রিংয়ের পরে () গেটসবস্ট্রিং () নয়।
বুহ বুহ

21
লিনক এক্সটেনশন লাস্ট () এর সাথে শেষ সংঘর্ষ হিসাবে এটি এটিকে টেল () বলে
ক্রেগ কার্টিস

5
এটি "1 লাইনের চেয়ে অনেক দীর্ঘ" করার জন্য +1। পঠন সাশ্রয়ের কারণে অপঠনযোগ্য কোডটি দেখতে খুব বিরক্তিজনক।
ফ্যাবিও মিলিহিরো

2
অথবা @ আরজে প্রোগ্রামার এর উত্তর অনুসারে ভিজ্যুয়াল বেসিকের সাথে সামঞ্জস্যতার জন্য ডান () এটিকে কল করুন (আমি কেবল একটি ফাংশনের জন্য অন্য কোনও সমাবেশ যোগ করতে চাই না)।
খ্রিস্টুটি

3
আমি এই সমাধান ভালোবাসি।
লুক


45

ঠিক আছে, তাই আমি দেখতে পাচ্ছি এটি একটি পুরাতন পোস্ট, তবে কেন আমরা ইতিমধ্যে ফ্রেমওয়ার্কটিতে সরবরাহ করা কোডটি পুনর্লিখন করছি?

আমি আপনাকে পরামর্শ দেব যে আপনি ফ্রেমওয়ার্ক ডিএলএল "মাইক্রোসফ্ট। ভিজুয়ালবাসিক"

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);

8
ভিবি কার্যকারিতা ব্যবহার করার জন্য একটি সময়ের দুর্দান্ত উদাহরণ
ব্রায়ান হোয়াইট

3
আমি তোমায় ভালোবাসি. আমার প্রোগ্রামিং অভিজ্ঞতা অধিকাংশই ভিবি আউট খোঁজার যে আমি যে, আমি তেমন পরিচিত নই যারা ফাংশন সব ব্যবহার করতে পারেন তাই ভয়ঙ্কর হয়
বেন Strombeck

6
আমি কখনই বুঝতে পারি না এমএস.ভিবি ব্যবহার করা যদি একটি ভাল ধারণা - তবে কেন এটি নামধারী জায়গায় রেখে দেওয়া হচ্ছে VisualBasic? TextFieldParserঅন্য একটি উদাহরণ। এই ইউটিলিটিগুলি এত আশ্চর্যের সাথে কেন সজ্জিত?
রাফিন

6
আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। চাকাটি পুনরায় উদ্ভাবন কেন?
জ্যাক

2
@ বম্বোকা: আমরা নিশ্চিত হতে পারি যে মাইক্রোসফ্ট ভিজ্যুয়াল বেসিককে সমর্থন অব্যাহত রাখলে এটি অব্যাহত থাকবে। এটি ৪.6 রিলিজের অন্তর্ভুক্ত এবং আমি এমএস থেকে স্পষ্ট বা ইঙ্গিতযুক্ত কিছুই খুঁজে পাচ্ছি না যে তারা ভিবি.নেটকে উন্নয়নের ভাষা হিসাবে সমর্থন বন্ধ করার পরিকল্পনা করে।
আরজে প্রোগ্রামার 21

30
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)

26

সাবস্ট্রিং ব্যবহার করা আসলে বেশ ছোট এবং পঠনযোগ্য:

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"

17

এখানে আরও একটি বিকল্প রয়েছে যা খুব খারাপভাবে সঞ্চালন করা উচিত নয় ( স্থগিতাদেশ কার্যকর হওয়ার কারণে ):

new string(mystring.Reverse().Take(4).Reverse().ToArray());

যদিও উদ্দেশ্যটির জন্য একটি এক্সটেনশন পদ্ধতি mystring.Last(4)পরিষ্কারভাবে পরিষ্কার সমাধান, তবে আরও কিছু কাজ করা হোক।


1
@ ব্রায়ান হোয়াইট লোকেরা নতুন বছরের পরেই বাজে?
কনরাড ভিল্টারস্টন

1
সুন্দর সমাধান। আমি এটা পছন্দ করি. তবে আপনি সঠিক স্ট্রিং পেতে অন্যান্য বিপরীতকে ভুলে গেছেন। অবশ্যই হবে: নতুন স্ট্রিং (মাইস্ট্রিং। বিপরীত ()। নিন (4)। বিপরীত ()। টুআর্রে ());
ইউরি মোরালেস

আঃ হ্যাঁ, আপনি সঠিক - আমার মানসিক সংকলক এতদূর ভাবেনি। দুঃখের বিষয় যা এটিকে আরও খারাপ করে তোলে! :)
আন্দ্রে লুস

1

1
আমি মনে করি না আপনি বুঝতে পেরেছেন, @ জর্জানআলিগারানসন, আমার বক্তব্যটি ছিল যে Reverse().Take(4).Reverse()প্রত্যেকে পুরো স্ট্রিংটি গণনা করে না, এটি কেবল চূড়ান্ত ToArrayআহ্বানে ঘটে । যদি বিলম্বিত সঞ্চালনের মতো কিছুই ছিলে না, এটা থেকে অনুবাদ হবে Reverse().ToArray().Take(4).ToArray().Reverse().ToArray()। এটি অবশ্যই অনুমান করে যে এই এক্সটেনশনগুলি মুলতুবি প্রকার - যা আমি চেক করি নি। স্ট্রিং কনস্ট্রাক্টরগুলি আইনিউমারেবল গ্রহণ করেন না, সুতরাং আপনাকে এটিকে একটি অ্যারেতে অঙ্ক করতে হবে।
আন্দ্রে লুয়াস

17

আপনি কেবল Substringসি # এর পদ্ধতিটি ব্যবহার করতে পারেন । প্রাক্তন জন্য।

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);

এটি ফলাফল 0000 ফিরে আসবে।


7
এটি 28 বার মত উত্তর দেওয়া হয়েছে এবং আপনি এটি আবার যুক্ত করেছেন? এবং কেন কেবলমাত্র প্রাপ্তির পরিবর্তে দ্বি-পরামিতি-ওভারলোড ব্যবহার করবেন startIndex?
অ্যান্ড্রু

ঠিক আমার উত্তরটি দরকার @আমিত কুমাওয়াতকে ভাগ করে নেওয়ার জন্য ধন্যবাদ।
ড্যারিল


7
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;

ভাল লাগছে, তবে আমি মনে করি আপনি বোঝাতে চেয়েছিলেন =না =+
dotancohen

1
mystring.Substring (mystring.Length - 4, 4) একই: মাইস্ট্রিং.সুবস্ট্রিং (মাইস্ট্রিং। লেংথ - 4)
মো হাওয়ার্ড


6

পূর্ববর্তী কয়েকটি উত্তরের তুলনায়, মূল পার্থক্য হ'ল ইনপুট স্ট্রিং যখন হয় তখন কোডের এই অংশটি বিবেচনা করা হয়:

  1. খালি
  2. অনুরোধ করা দৈর্ঘ্যের চেয়ে দীর্ঘ বা মিলছে
  3. অনুরোধ করা দৈর্ঘ্যের চেয়ে কম।

এটা এখানে:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }

    public static string MyLast(this string str, int length)
    {
        if (str == null)
            return null;
        else if (str.Length >= length)
            return str.Substring(str.Length - length, length);
        else
            return str;
    }
}

4

সংজ্ঞা:

public static string GetLast(string source, int last)
{
     return last >= source.Length ? source : source.Substring(source.Length - last);
}

ব্যবহার:

GetLast("string of", 2);

ফলাফল:

এর


3

এটি কোনও দৈর্ঘ্যের স্ট্রিংয়ের জন্য ব্যর্থ হবে না।

string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"

এটি সম্ভবত টাস্কটির জন্য অতিমাত্রার কাজ, তবে যদি অতিরিক্ত বৈধতা প্রয়োজন হয় তবে এটি সম্ভবত নিয়মিত প্রকাশে যুক্ত করা যেতে পারে।

সম্পাদনা: আমি মনে করি এই রেজেক্স আরও কার্যকর হবে:

@".{4}\Z"

5
অবশ্যই ওভারকিল আমি এটির জন্য স্ট্রিংয়ের সহজ পদ্ধতিগুলির সাথে লেগে থাকব।
16:44

দ্বিতীয় বর্ণটি তিন অক্ষরের আর্গুমেন্টের সাথে ডাকলে তিনটি বর্ণের স্ট্রিং ফেরত দেয় না, তাই এটি নেতিবাচক লুকোহেড ব্যবহার করে আপনার প্রথম বুদ্ধিমান সংস্করণের সমতুল্য নয়! :-)
avl_swen

3

জেনেরিক ব্যবহার করুন Last<T>। এটি IEnumerableস্ট্রিং সহ যে কোনও সাথে কাজ করবে ।

public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
    int count = Math.Min(enumerable.Count(), nLastElements);
    for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
    {
        yield return enumerable.ElementAt(i);
    }
}

এবং স্ট্রিংয়ের জন্য একটি নির্দিষ্ট:

public static string Right(this string str, int nLastElements)
{
    return new string(str.Last(nLastElements).ToArray());
}

1
কি দারুন. Overkill। সম্ভবত গণনার মতো কিছু। স্কিপ (এনিউরেবল.কাউন্ট () - n শেষ উপাদানসমূহ)?
বুহ বুহ

আমি ওভারকিল হওয়ার বিষয়ে @ বুবুবু'র সাথে একমত নই। তবে আমি নাম হিসাবে "ডান" থেকে "শেষ" পছন্দ করি। আমি বিদ্যমান বিদ্যমান শেষের <টি> এর ওভারলোডিং সম্পর্কে কিছুটা কৌতুকপূর্ণ। আমিও "এড়িয়ে যাই" এর দিকে ঝুঁকির মতো।
সম্ভাব্যভাবে অস্বীকারযোগ্য

আমি এই সমাধানটি পছন্দ করি। আইইনুমেবল শেখার সময় সহজ নয় বরং ইন্টারস্টিটিং।
পিরেলিয়ান

1

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

    /// <summary>
    /// Returns characters slices from string between two indexes.
    /// 
    /// If start or end are negative, their indexes will be calculated counting 
    /// back from the end of the source string. 
    /// If the end param is less than the start param, the Slice will return a 
    /// substring in reverse order.
    /// 
    /// <param name="source">String the extension method will operate upon.</param>
    /// <param name="startIndex">Starting index, may be negative.</param>
    /// <param name="endIndex">Ending index, may be negative).</param>
    /// </summary>
    public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
    {
        // If startIndex or endIndex exceeds the length of the string they will be set 
        // to zero if negative, or source.Length if positive.
        if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
        if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;

        // Negative values count back from the end of the source string.
        if (startIndex < 0) startIndex = source.Length + startIndex;
        if (endIndex < 0) endIndex = source.Length + endIndex;         

        // Calculate length of characters to slice from string.
        int length = Math.Abs(endIndex - startIndex);
        // If the endIndex is less than the startIndex, return a reversed substring.
        if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();

        return source.Substring(startIndex, length);
    }

    /// <summary>
    /// Reverses character order in a string.
    /// </summary>
    /// <param name="source"></param>
    /// <returns>string</returns>
    public static string Reverse(this string source)
    {
        char[] charArray = source.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// Verifies that the index is within the range of the string source.
    /// </summary>
    /// <param name="source"></param>
    /// <param name="index"></param>
    /// <returns>bool</returns>
    public static bool ExceedsLength(this string source, int index)
    {
        return Math.Abs(index) > source.Length ? true : false;
    }

সুতরাং আপনার যদি "এটি একটি এক্সটেনশন পদ্ধতি" এর মতো স্ট্রিং থাকে তবে এখানে কয়েকটি উদাহরণ এবং ফলাফল আশা করা যায়।

var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"

আশা করি এই সংস্করণটি কারও পক্ষে সহায়ক। আপনি যদি কোনও নেতিবাচক সংখ্যা ব্যবহার না করেন তবে এটি কেবল স্বাভাবিকের মতোই কাজ করে এবং ব্যাপ্তি প্যারামের বাইরে ডিফল্ট সরবরাহ করে।


1
string var = "12345678";

if (var.Length >= 4)
{
    var = var.substring(var.Length - 4, 4)
}

// result = "5678"

1

ধরে নিচ্ছি আপনি একটি স্ট্রিংয়ের মধ্যে স্ট্রিং চেয়েছিলেন যা শেষ অক্ষর থেকে 10 টি অক্ষর এবং আপনার কেবল 3 টি অক্ষর প্রয়োজন।

চল বলি StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

উপরের দিকে, আমি "273"এটি ব্যবহার করতে হবে যা আমি ডেটাবেস কোয়েরিতে ব্যবহার করব

        //find the length of the string            
        int streamLen=StreamSelected.Length;

        //now remove all characters except the last 10 characters
        string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));   

        //extract the 3 characters using substring starting from index 0
        //show Result is a TextBox (txtStreamSubs) with 
        txtStreamSubs.Text = streamLessTen.Substring(0, 3);

এই প্রশ্নটি স্পষ্টভাবে স্ট্রিংয়ের শেষ চারটি অক্ষরের জন্য জিজ্ঞাসা করে। মনে হচ্ছে আপনি স্ট্রিংয়ের মাঝামাঝি থেকে জিনিসগুলি উত্তোলন সম্পর্কিত একটি পৃথক প্রশ্নের উত্তর দিচ্ছেন। এছাড়াও Substringইতিমধ্যে আপনাকে একটি সূচনা পয়েন্ট এবং দৈর্ঘ্যে পাস করতে দেয় যাতে নিশ্চিত হয় না যে আপনি কেন Removeপ্রথমে শুরুটি সরিয়ে দেওয়ার পরিবর্তে এটি ব্যবহার করবেন না ।
ক্রিস

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