文字列の順番を逆転する §
ここに、"あいこ/たろう/ポチ"という文字列があるとします。
順番を逆転して"ポチ/たろう/あいこ"と加工したいと思います。
ただ単に文字列を逆順にするだけでは"チポ/うろた/こいあ"となって意図した結果になりません。
ここで必要なのは、区切り文字を意識して名前ごとに文字列を分解した上で並び順を変更することです。
分解するには §
区切り文字を元に文字列を分解する方法はいくつかあります。
最も簡単で分かりやすいのはSplitメソッドを使う方法です。
Splitメソッドには多くのバリエーションがありますが、最も簡単な使い方は文字列.Split(区切り文字)で区切り文字ごとに分解された配列を得る使い方です。
つまり、"あいこ/たろう/ポチ"という1つの文字列を、"あいこ","たろう","ポチ"という3つの文字列に分解できます。
逆順にするには §
配列の逆順を得るにはLINQのReverseメソッドを使うと簡単です。ここではそれを使っています。
配列自身もReverseメソッドを持っています。
分解された文字列を元に戻すには §
分解した文字列を区切り記号を付けて連結するにはJoinメソッドを使うと便利です。
1本の文字列をSplitで分解し、加工した上でJoinメソッドで1本の文字列に戻すのはC#の定跡の一つです。
罠の数々 §
- Splitメソッドは文字列に付けます。しかしJoinメソッドは静的なので型名のStringに付けます。書き方が違います
- 配列とLINQのRevrseメソッドが仕様が全く違います。混用すると意図しない結果になります
- LINQのRevrseメソッドが返すのは列挙型です。Joinメソッドは配列ではなく列挙型でも受け入れてくれるので、このサンプルソースは動きます
参考リンク §
String.Split メソッド
String.Join メソッド
Enumerable.Reverse メソッド
Array.Reverse メソッド
リポジトリ §
https://github.com/autumn009/cshowto
StringSplitJoin §
using System;
using System.Linq;
class Program
{
static void Main()
{
// 元データ
string src = "あいこ/たろう/ポチ";
// 間違った逆順
string dst1 = new string(src.Reverse().ToArray());
Console.WriteLine($"間違った逆順: {dst1}");
// 正しい逆順
// まず配列に分解する
string[] ar = src.Split('/');
// 配列確認
foreach (var item in ar) Console.WriteLine($"分解された要素 {item}");
// 配列の逆順
var rev = ar.Reverse();
// 逆順の確認
foreach (var item in rev) Console.WriteLine($"逆順の要素 {item}");
// 配列から区切り文字を入れて文字列を組み立てる
string dst2 = string.Join('/', rev);
Console.WriteLine($"正しい逆順: {dst2}");
}
}
実行結果
違った逆順: チポ/うろた/こいあ
分解された要素 あいこ
分解された要素 たろう
分解された要素 ポチ
逆順の要素 ポチ
逆順の要素 たろう
逆順の要素 あいこ
正しい逆順: ポチ/たろう/あいこ