c#文字列操作のテクニックのまとめ

2064 ワード

文字列はクラスによって定義され、次のようになります.
1 public sealed class String : IComparable, ICloneable, IConvertible, IComparable, IEnumerable, IEnumerable, IEquatable
インタフェースIEnumerableから派生していることに注意してください.すべての単一文字を得るには簡単です.
1 List chars = s.ToList();
文字列を統計する場合も簡単です.
1 int cn = s.Count(itm => itm.Equals('{'));
文字列を反転する場合は、次のようになります.
1 new string(s.Reverse().ToArray());
文字列を巡回する場合は、拡張メソッドForEachを使用すればよい.
今、listの文字列に対して、いくつかの条件を満たすものを置き換えたいと思っています.条件を満たさないものは残しておきます.問題が来て、forachの時文字列自体を修正することはできません.msdnには次のような記述があるからです.
A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification.
次のコードは、実際には2つの文字列を構築しています.
1 string st = "Hello,world";
2 st = "Hello,world2";
その問題に戻って、簡単な方法はまずリストを構築して、それから元の文字列を遍歴して、条件の修正を満たしてから新しいlistを加えて、満たさない直接加入することだと思います.この方法は簡単で原始的で,効率も最も高い.LinqにはUNIONというキーワードがあり、sqlにもUNIONという集合操作があるので、この問題を解決するには以下のようにします.
 
  
   private List StringCleanUp(List input)
         {
             Regex reg = new Regex(@"\(\w+?)\\1\>", RegexOptions.Singleline);
  
             var matchItem = (
                     from c in input
                     where reg.IsMatch(c)
                     select reg.Replace(c, matchEvaluator)
                 ).Union(
                     from c in input
                     where !reg.IsMatch(c)
                     select c
                 );
  
             return matchItem.ToList();
         }
  
         private string matchEvaluator(Match m)
         {
             return m.Groups[2].Value;
         }

以上は正規表現でマッチングし,マッチングした場合は元の情報をマッチングしたグループ2の情報で置き換える.一致しない場合は、元の文字列を使用します.
もし問題があれば指摘してください.