2010年9月5日日曜日

JoinStringはないの?

VB6のJoin関数および.Net FrameworkのString.Joinメソッドは、
XEで追加されたほどSplitString使用頻度は多くないがたまに必要に
なることがある。

Help,ソースをざっくり見たところなさそうだったので実装してみた。
(といっても文字列を連結しただけですが・・・)

以下、ソースコード

  1. unit VbLikeStringUtil;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   StrUtils,Types;  
  7.   
  8.   function JoinString(AStrings: TStringDynArray; Delemeter : String) : String;  
  9.   
  10. implementation  
  11.   
  12. uses  
  13.   SysUtils;  
  14.   
  15. function JoinString(AStrings: TStringDynArray; Delemeter : String) : String;  
  16. var  
  17.   i : Longint;  
  18. begin  
  19.   
  20.   Result := '';  
  21.   for i := low(AStrings) to high(AStrings) do  
  22.   begin  
  23.     Result := Result + AStrings[i];  
  24.     if i < high(AStrings) then Result := Result + Delemeter;  
  25.   end;  
  26.   
  27.   
  28. end;  
  29.   
  30. end.  


実際の使用方法のサンプルは、こんな感じ

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     Label1: TLabel;  
  13.     procedure Button1Click(Sender: TObject);  
  14.   private  
  15.     { Private 宣言 }  
  16.   public  
  17.     { Public 宣言 }  
  18.   end;  
  19.   
  20. var  
  21.   Form1: TForm1;  
  22.   
  23. implementation  
  24.   
  25. uses  
  26.   StrUtils,Types, VbLikeStringUtil;  
  27.   
  28. {$R *.dfm}  
  29.   
  30. procedure TForm1.Button1Click(Sender: TObject);  
  31. var  
  32.   JoinItems : TStringDynArray;  
  33. begin  
  34.   
  35.   
  36.   SetLength(JoinItems,5);  
  37.   
  38.   JoinItems[0] := 'イージス';  
  39.   JoinItems[1] := 'ジャスティス';  
  40.   JoinItems[2] := 'ザク';  
  41.   JoinItems[3] := 'セイバー';  
  42.   JoinItems[4] := 'グフ';  
  43.   
  44.   
  45.   Label1.Caption := JoinString(JoinItems,'|');  
  46.   
  47.   
  48. end;  
  49.   
  50. end.  

2 件のコメント:

Delフサ さんのコメント...

こんにちは。
Delフサです。

先日はありがとうございます。

JoinStringは、オープン配列パラメータを引数指定に使ってみてはどうでしょうか。

今の動的文字配列の引数渡しもできるし、
JoinString(['A', 'B', 'C'], '/')
という形式での渡し方もできると思います。

あと、実行結果を示す場合

Label1.Captionだと、動作させるまで結果はわかりませんが

Assert('イージス|ジャスティス|ザク|セイバー|グフ'=JoinString(JoinItems,'|'));

こんな風にテストコードも書いておいていただけますと
コード上で動作が確認できてよいのではないでしょうか。

JoinStringの内部のソースを全くみなくても
テストコードを見て動作を確認することができ
特に終端文字列の扱いなどについても知ることができて
わかりやすいと思います。

OldTPFun さんのコメント...

オープン配列版作ってみました。