プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 - レシピ編 文字列の操作(5)

2011/12/27


■━ [C#プログラミングレッスン] ━━━━━━━━━━━━━━━ No.315 ━□

「レシピ編」-- 文字列の操作 (5)
                                                            by Gushwell  
□━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■

今年最後の記事です。

今日のコード

 1.文字列をカンマの箇所で切り分けるには
 2.複数の文字列の最大幅で、文字列を右寄せするには

■□───────────────────────────────────
■□ 文字列をカンマの箇所で切り分けるには

文字列をカンマの箇所で切り分けるコードを示します。
Splitメソッドを使うと簡単に実現できます。

 string text = "C#,VB.NET,Perl,Ruby,F#";
 string[] strs = text.Split(',');
 strs.ToList().ForEach(Console.WriteLine);

strs配列には、"C#" "VB.NET" "Perl" "Ruby" "F#" の5つの文字列が格納されます。

では、"The quick brown fox jumps over a lazy dog." を空白の箇所で区切って
単語を抜き出してみましょう。

 string text = "The quick brown fox jumps over a lazy dog.";
 string[] strs = text.Split(' ').Select(s => s.TrimEnd('.')).ToArray();
 strs.ToList().ForEach(Console.WriteLine);

このコードでは、最後のピリオドをどうするかは問題です。単に、

 s.Split(' ')

としてしまうと、最後が、"dog." となってしまいます。これを避けるために、
Splitで得られた結果をさらにSelectメソッドを使い、加工しています。


■□───────────────────────────────────
■□ 複数の文字列の最大幅で、文字列を右寄せするには

先ほどのコード例で、文字列を空白で区切り、単語を抜き出しましたが、この複数の単語の
最大の長さに合わせ、右寄せにするコードを考えてみます。
結果を先に示すます。

  The
quick
brown
  fox
jumps
 over
    a
 lazy
  dog

これを実現するコードを示します。

  string text = "The quick brown fox jumps over a lazy dog.";
  var strs = text.Split(' ').Select(s => s.TrimEnd('.'));
  int maxlen = strs.Max(str => str.Length);
  foreach (var s in strs) {
      string format = string.Format("{{0,{0}}}", maxlen);
      // "{0,x}" のようなformat文字列を作成している。xが桁数を示す数値
      string rs = string.Format(format, s);
      Console.WriteLine(rs);
  }

このコードでは、strsは配列にする必要はないため、ToArrayメソッドは使っていま
せん。
IEnumerable<string> として扱っています。Maxメソッドで、最大の長さを求め、そ
れから、string.Formatを使い、右寄せにしています。
なお、2バイト文字があると使えませんのでご注意ください。

また、今のGUIの世界ではあまり使う場面はないかもしれません。しかし、こういっ
たコードを考えるのは、プログラミングの勉強にはなると思います


上記コードは、次のように書きかえることもできます。PadLeftというメソッドを使って
左側に空白を埋め込むことで、右寄せしています。

 string text = "The quick brown fox jumps over a lazy dog.";
 var strs = text.Split(' ').Select(s => s.TrimEnd('.'));
 int maxlen = strs.Max(str => str.Length);
 var query = from s in strs
             select s.PadLeft(maxlen);
 foreach (var x in query)
     Console.WriteLine(x);

■最後に、皆さんへの課題です。

もし、入力の文字列に2文字以上の空白が連続していた場合は、上記コードはどう
いう結果になるんでしょうか。それが望ましい結果でない場合、どのようにコード
を書き換えればよいでしょうか。

是非、考えてみてください。

─────────────────────────────────────

今年の『C#プログラミングレッスン』はこれで最後です。1年間ご購読ありがとう
ございました。
来年は、1月中ごろから発行開始する予定です。
それでは、来年またこのメルマガでお会いしましょう。


─────────────────────────────────────
『C#プログラミングレッスン』  (ほぼ週刊)                                 
☆皆さまからの感想をお待ちしています。http://gushwell.ifdef.jp/mail.html  
─────────────────────────────────────
Published by Gushwell.                                                    
  Copyright (C) 2011 Gushwell All rights reserved.                        
  Microsoft MVP for Visual C#(Apr 2005 - Mar 2012)                        
                                                                          
■Gushwell's Page                                                         
Gushwell's C# Dev Notes           : http://gushwell.ldblog.jp/            
Gushwell's C# Programming Page    : http://gushwell.ifdef.jp/             
Gushwellの読書ノート              : http://gushwell.jugem.jp/             
─────────────────────────────────────

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。