2011-09-16 15 views
2

こんにちは、これは私の最初の質問です。これらの2つの方法をより効率的にする方法

私はいくつかのユーティリティメソッドを構築しながらLambda/LINQで遊んでいます。

  1. 第1の方法は、のような

    "AdnanRazaBhatti" 
    

    を文字列を取り、同じようにそれを壊す、

    "Adnan Raza Bhatti" 
    
  2. 第二の方法は、第一の方法のような文字列を取得しても取り、

    out String[] brokenResults 
    

    と返品最初のメソッドのような壊れた文字列と、次のようにbrokenResults配列を埋めます。

    "Adnan" "Raza" "Bhatti" 
    

質問:

A.あなたは、これらの方法は、より効率的にする方法を提案してくださいことはできますか?

B.私はStringBuilderを使用しようとすると、Where、Select、StringBuilderクラスにSelectが存在しないなどの拡張メソッドを教えてくれます。なぜそうですか?インデクサーはStringBuilderでStringBuilder s = new StrinBuilder( "Dang")のような文字を取得しますが、 char c = s [0];ここでcharはDです。

コード

方法1:

public static string SplitCapital(string source) 
    { 

     string result = ""; 
     int i = 0; 
     //Separate all the Capital Letter 
     var charUpper = source.Where(x => char.IsUpper(x)).ToArray<char>(); 
     //If there is only one Capital letter then it is already atomic. 
     if (charUpper.Count() > 1) { 
      var strLower = source.Split(charUpper); 
      foreach (string s in strLower) 
       if (i < strLower.Count() - 1 && !String.IsNullOrEmpty(s)) 
        result += charUpper.ElementAt(i++) + s + " "; 
      return result; 
     } 
     return source; 
    } 

方法2:

public static string SplitCapital(string source, out string[] brokenResults) 
    { 
     string result = ""; 
     int i = 0; 
     var strUpper = source.Where(x => char.IsUpper(x)).ToArray<char>(); 

     if (strUpper.Count() > 1) { 
      var strLower = source.Split(strUpper); 

      brokenResults = ( 
       from s in strLower 
       where i < strLower.Count() - 1 && !String.IsNullOrEmpty(s) 
       select result = strUpper.ElementAt(i++) + s + " ").ToArray(); 

      result = ""; 
      foreach (string s in brokenResults) 
       result += s; 
      return result; 
     } 
     else { brokenResults = new string[] { source }; } 
     return source; 
    } 

注:

私はテーブルのカラム名を分割するには、これらのユーティリティメソッドを使用することを計画しています私は自分のデータベースから取得します。

たとえば、列名が "BooksId"の場合、これらのメソッドの1つをプログラムで「ブックスID」として使用して分割します。他の方法やデザインウィンドウや[データセット]のような列名の変更があります。 [tableName] .HeadersRow.Cells [0] .Text = "Books Id"でも、今後このメソッドを使用する予定です。

ありがとうございます。

+3

これは、コードレビュースタック交換に適している可能性があります。 – cdeszaq

答えて

4

あなたが大文字に基づいて文字列を分割するには、以下の拡張メソッドを使用することができます。

public static string Wordify(this string camelCaseWord) 
    { 
     /* CamelCaseWord will become Camel Case Word, 
      if the word is all upper, just return it*/ 

     if (!Regex.IsMatch(camelCaseWord, "[a-z]")) 
      return camelCaseWord; 

     return string.Join(" ", Regex.Split(camelCaseWord, @"(?<!^)(?=[A-Z])")); 
    } 

文字列配列に文字列を分割するには、これを使用することができます考慮のために例を挙げると、コードは次のようになります:

string strTest = "AdnanRazaBhatti"; 
var capitalCase = strTest.Wordify(); //Adnan Raza Bhatti 
var brokenResults = capitalCase.SplitOnVal(" "); //seperate by a blank value in an array 
+1

まだいくつかのタイプミス、 'Wordify'の'() 'と' CapitalCase'が 'capitalCase'になっています – Davy8

+0

プラス1ありがとうございました – MStp

+0

@ Davy8答えを更新しました。キャッチがありがとう:D – reggie

1

正規表現のように見えます。

私は[A-Z] [a-z] +がまずは良いかもしれないと思います。我々場合

public static string[] SplitOnVal(this string text,string value) 
    { 
     return text.Split(new[] { value }, StringSplitOptions.None); 
    } 

+0

プラス1ありがとう – MStp

2

このコードを確認してください

public static string SeperateCamelCase(this string value) 
{ 
    return Regex.Replace(value, "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1"); 
} 

この回答が役に立ちます。あなたが解決策を見つけたら、親切に私の答えに印を付け、それを指摘してください。

+0

プラス1ありがとう – MStp

1

バージョンを更新しました。文字列ビルダーを使用してメモリ使用率を削減しました。

string SplitCapital(string str) 
{ 
    //Search all capital letters and store indexes 
    var indexes = str 
     .Select((c, i) => new { c = c, i = i }) // Select information about char and position 
     .Where(c => Char.IsUpper(c.c)) // Get only capital chars 
     .Select(cl => cl.i); // Get indexes of capital chars 

    // If no indexes found or if indicies count equal to the source string length then return source string 
    if (!indexes.Any() || indexes.Count() == str.Length) 
    { 
     return str; 
    } 

    // Create string builder from the source string 
    var sb = new StringBuilder(str); 
    // Reverse indexes and remove 0 if necessary 
    foreach (var index in indexes.Reverse().Where(i => i != 0)) 
    { 
     // Insert spaces before capital letter 
     sb.Insert(index, ' '); 
    } 

    return sb.ToString(); 
} 

string SplitCapital(string str, out string[] parts) 
{ 
    var splitted = SplitCapital(str); 
    parts = splitted.Split(new[] { ' ' }, StringSplitOptions.None); 
    return splitted; 
} 
関連する問題