رشته‌ها در C#

09 فروردین 1398
درسنامه درس 6 از سری آموزش سی شارپ (C#)
csharp-strings

مطالعه‌ی فصل ۵ به شما کمک می‌کند تا با مفاهیم مقدماتی تا پیشرفته‌ی آرایه‌ها و انواع آن آشنایی کامل پیدا کنید. حال در این فصل می‌خواهیم به توضیح مفصل مبحث رشته‌ ها بپردازیم که در فصل ۲ (انواع داده) اشاره بسیار مختصری به آن داشتیم. با ما همراه باشید.

مقدمه

رشته‌ها در زبان برنامه‌نویسی C# به عنوان آرایه‌ای از کاراکترها شناخته می‌شوند. اما برای تعریف آنها به صورت معمول از کلمه‌ی کلیدی string استفاده می‌شود. کلمه‌ی کلیدی string نیز به خودی خود از کلاس System.String استفاده می‌کند.

ایجاد یک شیء رشته

شما می‌توانید یک شیء رشته را با استفاده از یکی از روش‌های زیر ایجاد کنید:

  • اختصاص یک متغییر برای رشته‌ها
  • استفاده از سازنده کلاس رشته‌ها (در مورد سازنده‌ها در بخش کلاس‌ها به تفصیل صحبت خواهیم کرد)
  • استفاده از عملگر + برای اتصال رشته‌ها
  • با استفاده از ویژگی‌ها یا متدهای کلاس رشته‌ها
  • با استفاده از فراخوانی متد رشته‌ها برای تبدیل یک متغییر به رشته

قبل از ورود به معرفی ویژگی‌ها و متدهای کلاس رشته بهتر است یک مثال را هم بررسی کنیم:

using System;
namespace StringApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         //from string literal and string concatenation
         string fname, lname;
         fname = "Rowan";
         lname = "Atkinson";
         
         string fullname = fname + lname;
         Console.WriteLine("Full Name: {0}", fullname);
         
         //by using string constructor
         char[] letters = { 'H', 'e', 'l', 'l','o' };
         string greetings = new string(letters);
         Console.WriteLine("Greetings: {0}", greetings);
         
         //methods returning string
         string[] sarray = { "Hello", "From", "Tutorials", "Point" };
         string message = String.Join(" ", sarray);
         Console.WriteLine("Message: {0}", message);
         
         //formatting method to convert a value
         DateTime waiting = new DateTime(2012, 10, 10, 17, 58, 1);
         string chat = String.Format("Message sent at {0:t} on {0:D}", waiting);
         Console.WriteLine("Message: {0}", chat);
      }
   }
}

در قسمت اول یک رشته را به صورت معمولی و با اختصاص یک مسیر یا مقدار تعریف کرده ایم (یعنی رشته‌های flname و lname را ایجاد کرده و مقداردهی کرده‌ایم). در قسمت بعدی یک متغییر به نام fullname تعریف کرده و مقادیر دو رشته‌ی قبلی را با استفاده از عملگر + به یکدیگر متصل نموده‌ایم.

خط بعدی نمایانگر یک آرایه‌ از کاراکترهاست که تشکیل یک رشته را می‌دهند و سپس با استفاده از سازنده پیشفرض کلاس string اقدام به ایجاد یک رشته کرده و آن را درون متغییر greeting ذخیره کرده‌ایم. (در مورد سازنده ها بعدا صحبت می کنیم. در همین حد بدانید که سازنده ها اولین متد در یک کلاس هستند که به هنگام استفاده از یک شی به صورت خودکار اجرا می شوند)

در مرحله بعدی از متدهای کلاس اصلی String برای استفاده از رشته‌ها بهره‌منده شده و با متد Join آرایه‌ای از رشته‌ها را به یکدیگر متصل کرده و به صورت واحد نمایش داده‌ایم. و در نهایت از روش و متد Format برای تبدیل یک مقدار به رشته بهره‌مند شده‌ایم. (توجه داشته باشید که جزئیات سازنده ها و متدها در بخش مربوط به کلاس‌ها آموزش داده می‌شوند و در این بخش برای تکمیل کردن مبحث رشته‌ها این موارد را ذکر کرده ایم). در نهایت خروجی این مثال به صورت زیر خواهد بود:

Full Name: Rowan Atkinson
Greetings: Hello
Message: Hello From Tutorials Point
Message: Message sent at 5:58 PM on Wednesday, October 10, 2012

برخی از ویژگی‌های کلاس String

char: این ویژگی شیء Char را در یک موقعیت مشخص در رشته‌ی جاری باز می‌گرداند.

Length: این ویژگی تعداد کاراکترهای یک رشته را در اختیار می‌گذارد.

برخی از متد‌های کلاس String

public static int Compare(string strA, string strB)

برای مقایسه‌ی دو رشته از نظر تعداد کاراکترها مورد استفاده قرار گرفته و مقداری که باز می‌گرداند شامل یک عدد صحیح است. به مثال زیر توجه کنید:

String A: First alphabetically
String B: Second alphabetically

Compare(A, B): -1
Compare(B, A):  1

Compare(A, A):  0
Compare(B, B):  0

در این مثال رشته‌ی A دارای ۲۰ کاراکتر بوده درحالیکه رشته‌ی B دارای ۲۱ کاراکتر است در نتیجه اگر با استفاده از متد Compare این دو رشته را با هم مقایسه کنیم مقدار ۱- برای مقایسه‌ی A با B (به معنای این است که رشته‌ی A یک کاراکتر کمتر از رشته‌ی B دارد) و مقدار ۱ برای مقایسه‌ی B با A و در نهایت مقدار ۰ برای مقایسه‌ی A با A و B با B نمایش می‌دهد.


public static int Compare(string strA, string strB, bool ignoreCase )

دقیقا مشابه تابع بالا کار می‌کند با این تفاوت که در این متد اگر مقدار ignoreCase برابر true تنظیم شود، این مقایسه نادیده گرفته شده و در غیر اینصورت به حساب می‌آید. از این متد برای جلوگیری از حساسیت بزرگ و کوچک بودن حروف استفاده می‌شود. مثلا اگر ignoreCase روی true تنظیم شود و دو رشته‌ی strA= "ABC", srtB="abc" باشد آنگاه مقایسه نتیجه‌ی true را باز می‌گرداند یعنی با هم دیگر از نظر ما برابر هستند.


public static string Concat(string str0, string str1)

این متد دو رشته را به یکدیگر متصل می‌کند.


public static string Concat(string str0, string str1, string str2)

این متد سه رشته را به یکدیگر متصل می‌کند.


public static string Concat(string str0, string str1, string str2, string str3)

این متد چهار رشته را به یکدیگر متصل می‌کند.


public bool Contains(string value)

این متد بررسی می‌کند که آیا مقدار درون آرگومان آن در رشته‌ی موردنظر وجود دارد یا خیر و پاسخ را به صورت true و false باز می‌گرداند.


public static string Copy(string str)

این متد یک رشته‌ی جدید را ایجاد کرده که مقادیر آن دقیقا مشابه رشته جاری است.


public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)

این متد یک رنج مشخصی از کاراکترها را از یک موقعیت مشخص درون یک رشته به یک موقعیت مشخص درون یک آرایه از نوع داده‌ی char کپی می‌کند. جهت ملموس شدن این متد به مثال زیر توجه کنید:

using System;

public class CopyToTest {
    public static void Main() {

        // Embed an array of characters in a string
        string strSource = "changed";
    char [] destination = { 'T', 'h', 'e', ' ', 'i', 'n', 'i', 't', 'i', 'a', 'l', ' ',
                'a', 'r', 'r', 'a', 'y' };

        // Print the char array
        Console.WriteLine( destination );

        // Embed the source string in the destination string
        strSource.CopyTo ( 0, destination, 4, strSource.Length );

        // Print the resulting array
        Console.WriteLine( destination );

        strSource = "A different string";

        // Embed only a section of the source string in the destination
        strSource.CopyTo ( 2, destination, 3, 9 );

        // Print the resulting array
        Console.WriteLine( destination );
    }
}
// The example displays the following output:
//       The initial array
//       The changed array
//       Thedifferentarray

در متد CopyTo آرگومان اول که با مقدار ۰ مشخص شده است ایندکس موجود در آرایه‌ی اولیه strSource است و آرگومان دوم که با عنوان destination می‌باشد به عنوان آرایه‌ای از کاراکترها Char شناخته می‌شود. سپس در آرگومان سوم ایندکس مورد نظر در آرایه‌ی Char را مشخص کرده و در نهایت در آرگومان چهارم به متد می‌گوییم که این مقدار تا کدام ایندکس تاثیر بگذارد.


public bool EndsWith(string value)

این متد مشخص می‌کند که آیا رشته‌ی موردنظر با مقدار درون آرگومان به اتمام رسیده است یا خیر؟


public bool Equals(string value)

این متد مشخص می‌کند که آیا این رشته با یک رشته‌ی دیگر برابر است یا خیر؟


public static bool Equals(string a, string b)

با استفاده از این متد می‌توان مشخص کرد که دو رشته‌ی موردنظر درون آرگومان با هم برابر هستند یا خیر؟


public static string Format(string format, Object arg0)

با استفاده از این متد هر چندتا آیتمی که در arg قرار بگیرد به صورت رشته تبدیل شده و نمایش داده می‌شود.


public int IndexOf(char value)

این متد ایندکس یک آرایه را متناسب با موقعیتی که درون یک رشته دارد باز می‌گرداند.


public int IndexOf(string value)

این متد ایندکس اولین قسمت یک رشته‌ را درون یک مجموعه رشته مشخص می‌کند.


public int IndexOf(char value, int startIndex)

این متد ایندکس یک کاراکتر مشخص را که در آرگومان اول تعریف کرده‌ایم پس از ایندکس startIndex جستجو می‌کند. به مثال زیر توجه کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RoxoApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            char chrA = 'r';
            string strB = "Welcome to roxo tutorial world";

            Console.WriteLine(strB.IndexOf(chrA, 15));
            Console.ReadKey();
        }
    }
}

در این مثال از ایندکس شماره ۱۵ شروع به جستجو کرده و هرجا به کاراکتر r برخورد کرد ایندکس آن را نمایش می‌دهد.


public int IndexOf(string value, int startIndex)

با استفاده از این متد می‌توان جستجوی رشته‌ی value را پس از ایندکس startIndex در یک رشته شروع کرده و نتیجه را به صورت شماره‌ی ایندکس آن نمایش داد.


public int IndexOfAny(char[] anyOf)

این متد تمام کاراکترهایی که درون آرایه‌ی char قرار گرفته‌اند را روی رشته‌ی جاری جستجو کرده و ایندکس اولین موقعیت هر کاراکتری را که پیدا کند نمایش می‌دهد. به مثال زیر توجه کنید:

using System;

public class Example
{
   public static void Main()
   {
      char[] chars = { 'a', 'e', 'i', 'o', 'u', 'y', 
                       'A', 'E', 'I', 'O', 'U', 'Y' };
      String s = "The long and winding road...";
      Console.WriteLine("The first vowel in \n   {0}\nis found at position {1}", 
                        s, s.IndexOfAny(chars));                         
   }
}
// The example displays the following output:
//       The first vowel in
//          The long and winding road...
//       is found at position 2

در این مثال جستجو انجام شده روی رشته‌ی s به گونه‌ایست که اولین کاراکتر e از مجموعه آرایه‌ی کاراکتر chars در دومین موقعیت رشته‌ی s پیدا شده است.


public int IndexOfAny(char[] anyOf, int startIndex)

دقیقا مشابه متد قبلی است با این تفاوت که مشخص می‌کنیم جستجو از کدام ایندکس صورت بگیرد.


public string Insert(int startIndex, string value)

با استفاده از این متد می‌توان در موقعیت ایندکس startIndex مقدار رشته‌ی value را به رشته جاری اضافه کرد.


public static bool IsNullOrEmpty(string value)

مشخص می‌کند که آیا رشته‌ی موردنظر خالی یا Null‌ است. سپس جواب را به صورت true یا false باز می‌گرداند. توجه داشته باشید که یک مقدار خالی برابر "" بوده و یک مقدار null دقیقا برابر عبارت null است.

string strA = ""; // مقدار خالی
string strB = null; // مقدار null

public static string Join(string separator, params string[] value)

با استفاده از این متد می‌توان المان‌های آرایه‌ای از رشته‌ها را به یکدیگر با استفاده از جداکننده‌ی مشخصی متصل کرد. به مثال زیر توجه کنید:

string[] sarray = { "Hello", "From", "Tutorials", "Point" };
string message = String.Join(" ", sarray);
Console.WriteLine("Message: {0}", message);

// خروجی
// Hello From Tutorials Point

public static string Join(string separator, string[] value, int startIndex, int count)

با استفاده از این متد و در اختیار داشتند یک رشته به نام separator و یک ارایه‌ای از رشته‌ها به نام value می‌توان از ایندکس مشخص شده روی رشته‌ی value تا مقدار شمارش شده count مقادیر را به یکدیگر متصل کرد. به مثال زیر توجه کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RoxoApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            String[] strA = { "masoud", "reza", "hasan", "roxo", "tutorial" };

            Console.WriteLine(String.Join(", ", strA, 2, 2));
            Console.ReadKey();
        }
    }
}

در این مثال از ایندکس شماره ۲ شروع کرده و ۲ عدد از المان‌ها را به یکدیگر متصل می‌کند که در نهایت خروجی به صورت زیر است:

hasan, roxo

public int LastIndexOf(char value)

این متد موقعیت ایندکس آخرین کاراکتر یک رشته را باز می‌گرداند.


public int LastIndexOf(string value)

این متد موقعیت ایندکس آخرین رشته‌ی موجود در رشته‌ی جاری باز می‌گرداند.


public string Remove(int startIndex)

این متد کاراکترهایی که پس از ایندکس startIndex قرار می‌گیرند را حذف می‌کند و رشته‌ی جدیدی را باز می‌گرداند.


public string Remove(int startIndex, int count)

این متد مشابه متد قبل عمل کرده با این تفاوت که کاراکترهای پس از ایندکس startIndex را به تعداد count حذف می‌کند.


public string Replace(char oldChar, char newChar)

با استفاده از این متد می‌توان یک کاراکتر قدیمی oldChar را با کاراکتر جدید newChar جایگزین کرد.


public string Replace(string oldValue, string newValue)

دقیقا مشابه متد قبل بوده با این تفاوت که این متد روی رشته‌ها انجام می‌شود.


public string[] Split(params char[] separator)

با استفاده از متد یک رشته به کاراکترهای دیگری تقسیم بندی شده و درون آرایه‌ی string موردنظر ریخته می‌شوند.


public string[] Split(char[] separator, int count)

دقیقا مشابه متد قبل عمل کرده با این تفاوت که در این متد تعداد کاراکترها مشخص است. برای روشن شدن این موضوع به مثال زیر توجه کنید:

using System;

public class Example
{
   public static void Main()
   {
      String value = "This is a short string.";
      Char delimiter = 's';
      String[] substrings = value.Split(delimiter);
      foreach (var substring in substrings)
         Console.WriteLine(substring);
   }
}
// The example displays the following output:
//     Thi
//      i
//      a
//     hort
//     tring.

public bool StartsWith(string value)

این متد مشخص می‌کند که آیا رشته‌ی موردنظر با مقدار value شروع شده است یا خیر؟


public char[] ToCharArray()

با استفاده از این متد یک رشته به آرایه‌ای از کاراکترها تبدیل می‌شود. به مثال زیر توجه کنید:

using System;

public class Example
{
   public static void Main()
   {
      String s = "AaBbCcDd";
      var chars = s.ToCharArray();
      Console.WriteLine("Original string: {0}", s);
      Console.WriteLine("Character array:");
      for (int ctr = 0; ctr < chars.Length; ctr++)
         Console.WriteLine("   {0}: {1}", ctr, chars[ctr]);
   }
}

// The example displays the following output:
//     Original string: AaBbCcDd
//     Character array:
//        0: A
//        1: a
//        2: B
//        3: b
//        4: C
//        5: c
//        6: D
//        7: d

public char[] ToCharArray(int startIndex, int length)

دقیقا مشابه متد قبلی است با این تفاوت که موقعیت ایندکس روی رشته موردنظر به همراه طولی که می‌خواهیم این تبدیل را انجام دهیم مشخص توسط آرگومان length مشخص می‌شود.


public string ToLower()

تمام حروف یک رشته را به صورت lowercase (حروف کوچک) نمایش می‌دهد.


public string ToUpper()

تمام حروف یک رشته را به صورت uppercase (حروف بزرگ) نمایش می‌دهد.


public string Trim()

تمام فضاهای خالی و space موجود در یک رشته را حذف می‌کند.


بسیار عالیست در این بخش آموزش مباحث مربوط به رشته‌ها به اتمام رسید و شما عزیزان می‌توانید با جمع بندی موردنظر خود از فصل ۱ تا ۶ مقدمات زبان سی شارپ را یکبار دیگر مرور بفرمایید. این مجموعه‌ی آموزشی ادامه دارد. با ما همراه باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.