文字列

更新 : 2007 年 11 月

C# 文字列は、string キーワード (System.String クラスを表す C# 言語のショートカット) を使用して宣言された 1 つ以上の文字のグループです。C# の文字列は、C や C++ の文字配列よりもはるかに使いやすく、プログラミング エラーが発生する可能性が低くなります。

リテラル文字列を宣言するときには、次の例に示すように引用符を使用します。

string greeting = "Hello, World!";

次のように部分文字列を抽出して文字列を連結できます。

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

作成した文字列オブジェクトは変更できません。文字列を操作するメソッドは、実際には新しい文字列オブジェクトを返します。したがって、パフォーマンス上の理由から、連結など、文字列操作がかかわる操作を大量に実行する場合には、次のコード例に示すようにStringBuilder クラスを使用してください。

文字列操作

エスケープ文字

文字列には "\n" (改行) や "\t" (タブ) などのエスケープ文字を使用できます。次の行があるとします。

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
  Row 1
  Row 2
  Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

上の例と同じものを次に示します。

Hello

World!

円記号を使用する場合は、その前に円記号をもう 1 つ挿入してください。次の文字列があるとします。

         string filePath = @"C:\Users\scoleridge\Documents\";
         //Output: C:\Users\scoleridge\Documents\

         string text = @"My pensive SARA ! thy soft cheek reclined
Thus on mine arm, most soothing sweet it is
To sit beside our Cot,...";
         /* Output:
         My pensive SARA ! thy soft cheek reclined
            Thus on mine arm, most soothing sweet it is
            To sit beside our Cot,... 
         */

         string quote = @"Her name was ""Sara.""";
         //Output: Her name was "Sara."

上の例と実際には同じものを次に示します。

\\My Documents\

@ 記号

@ 記号は、文字列の作成時にエスケープ文字および改行を無視することを指定します。したがって次の 2 つの文字列は同一です。

string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";

ToString()

すべての C# 組み込みデータ型には、値を文字列に変換する ToString メソッドが用意されています。このメソッドでは、次のように数値を文字列に変換できます。

int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg);  // outputs "Eve was born in 1999"

各文字へのアクセス

文字列のそれぞれの文字にアクセスするには、SubstringReplaceSplit および Trim などのメソッドを使用します。

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

また、次に示すように文字を文字配列にコピーすることもできます。

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?            

文字列のそれぞれの文字にアクセスするには、インデックスを次のように使用します。

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

大文字と小文字の変更

文字列の文字の大文字/小文字を変更するには、ToUpper() または ToLower() を次のように使用します。

string s6 = "Battle of Hastings, 1066";

System.Console.WriteLine(s6.ToUpper());
// outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower());
// outputs "battle of hastings 1066"

比較

ローカライズされない 2 つの文字列を比較する最適な方法は、Equals メソッドと StringComparison.Ordinal および StringComparison.OrdinalIgnoreCase を使用する方法です。

// Internal strings that will never be localized.
string root = @"C:\users";
string root2 = @"C:\Users";

// Use the overload of the Equals method that specifies a StringComparison.
// Ordinal is the fastest way to compare two strings.
bool result = root.Equals(root2, StringComparison.Ordinal);

Console.WriteLine("Ordinal comparison: {0} and {1} are {2}", root, root2,
                    result ? "equal." : "not equal.");

// To ignore case means "user" equals "User". This is the same as using
// String.ToUpperInvariant on each string and then performing an ordinal comparison.
result = root.Equals(root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine("Ordinal ignore case: {0} and {1} are {2}", root, root2,
                     result ? "equal." : "not equal.");

// A static method is also available.
bool areEqual = String.Equals(root, root2, StringComparison.Ordinal);


// String interning. Are these really two distinct objects?
string a = "The computer ate my source code.";
string b = "The computer ate my source code.";

// ReferenceEquals returns true if both objects
// point to the same location in memory.
if (String.ReferenceEquals(a, b))
    Console.WriteLine("a and b are interned.");
else
    Console.WriteLine("a and b are not interned.");

// Use String.Copy method to avoid interning.
string c = String.Copy(a);

if (String.ReferenceEquals(a, c))
    Console.WriteLine("a and c are interned.");
else
    Console.WriteLine("a and c are not interned.");

文字列オブジェクトの CompareTo() メソッドは、ある文字列が別の文字列より小さいか (<) または大きいか (>) に基づいて整数値を返します。文字列比較では Unicode 値が使用されます。また、小文字の値は対応する大文字の値よりも小さくなります。

// Enter different values for string1 and string2 to
// experiement with behavior of CompareTo
string string1 = "ABC";
string string2 = "abc";

int result2 = string1.CompareTo(string2);

if (result2 > 0)
{
    System.Console.WriteLine("{0} is greater than {1}", string1, string2);
}
else if (result2 == 0)
{
    System.Console.WriteLine("{0} is equal to {1}", string1, string2);
}
else if (result2 < 0)
{
    System.Console.WriteLine("{0} is less than {1}", string1, string2);
}
// Output: ABC is less than abc

文字列の中にある文字列を検索するには、IndexOf() を使用します。IndexOf() は、検索文字列が見つからない場合は -1 を返し、見つかった場合は該当文字列の最初の位置を示す 0 から始まるインデックスを返します。

// Date strings are interpreted according to the current culture.
// If the culture is en-US, this is interpreted as "January 8, 2008",
// but if the user's computer is fr-FR, this is interpreted as "August 1, 2008"
string date = "01/08/2008";
DateTime dt = Convert.ToDateTime(date);            
Console.WriteLine("Year: {0}, Month: {1}, Day: {2}", dt.Year, dt.Month, dt.Day);

// Specify exactly how to interpret the string.
IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

// Alternate choice: If the string has been input by an end user, you might 
// want to format it according to the current culture:
// IFormatProvider culture = System.Threading.Thread.CurrentThread.CurrentCulture;
DateTime dt2 = DateTime.Parse(date, culture, System.Globalization.DateTimeStyles.AssumeLocal);
Console.WriteLine("Year: {0}, Month: {1}, Day {2}", dt2.Year, dt2.Month, dt2.Day);

/* Output (assuming first culture is en-US and second is fr-FR):
    Year: 2008, Month: 1, Day: 8
    Year: 2008, Month: 8, Day 1
 */

部分文字列への文字列の分割

文字列を部分文字列に分割する操作 (文を単語に分割する操作など) は、一般的なプログラミング タスクです。Split() メソッドは、区切り記号 (空白文字など) から成る char 配列を受け取り、部分文字列の配列を返します。この配列にアクセスするには、foreach を次のように使用します。

string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
  Console.WriteLine("number1 now = {0}", number1);
else
  Console.WriteLine("numString is not a valid long");

byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
  Console.WriteLine("number2 now = {0}", number2);
else
  Console.WriteLine("numString is not a valid byte");

decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
  Console.WriteLine("number3 now = {0}", number3);
else
  Console.WriteLine("number3 is not a valid decimal");            

上記のコードにより、次に示すように 1 行に 1 つの単語が出力されます。

The

cat

sat

on

the

mat.

StringBuilder の使用

StringBuilder クラスが作成する文字列バッファにより、プログラムで大量の文字列操作を実行する場合のパフォーマンスが向上します。StringBuilder クラスを使用して、組み込み文字列データ型ではサポートされていない個別の文字を再割り当てできます。

この例では、StringBuilder オブジェクトが作成され、Append メソッドを使用してオブジェクトの文字が 1 つずつ追加されます。

class TestStringBuilder
{
    static void Main()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // Create a string composed of numbers 0 - 9
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        System.Console.WriteLine(sb);  // displays 0123456789

        // Copy one character of the string (not possible with a System.String)
        sb[0] = sb[9];

        System.Console.WriteLine(sb);  // displays 9123456789
    }
}

参照

処理手順

方法 : 複数行のリテラル文字列を生成する (Visual C#)

方法 : 文字列の配列内で文字列を検索する

方法 : 文字列内を検索する

概念

C# 言語の概要

組み込みデータ型 (Visual C# Express)

参照

string (C# リファレンス)