如何使这两种方法更加高效

时间:2011-09-16 17:19:15

标签: c# asp.net linq stringbuilder

大家好,这是我第一个问题,所以请放轻松我。

我正在使用Lambda / LINQ,同时构建自己很少的实用方法。

  1. 第一种方法采用字符串,

    "AdnanRazaBhatti" 
    

    并将其分解为,

    "Adnan Raza Bhatti"
    
  2. 第二种方法采用类似第一种方法的字符串,也需要

    out String[] brokenResults 
    

    并像第一个方法一样返回断开的字符串,并按如下方式填充brokenResults数组。

      "Adnan" "Raza" "Bhatti"
    
  3. 的问题:

    一个。您能否建议如何提高这些方法的效率?

    B中。当我尝试使用StringBuilder时,它告诉我扩展方法,例如,Where,Select对于StringBuilder类不存在,为什么会这样?尽管索引器在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”,我将使用其中一种方法将其分解为“Books Id”,我知道还有其他方法或重命名列名,如设计窗口或[数据集]。[ tableName] .HeadersRow.Cells [0] .Text =“Books Id”但我也打算将来在其他地方使用这种方法。

    谢谢

4 个答案:

答案 0 :(得分: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])"));
    }

要在字符串数组中拆分字符串,可以使用:

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

如果我们考虑你的例子,代码将如下:

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

答案 1 :(得分:2)

检查此代码

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

希望这个答案可以帮到你。如果你找到解决方案,请标记我的答案并指出它。

答案 2 :(得分:1)

在我看来,正规表达是最佳选择。

我认为[A-Z] [a-z] +可能是一个很好的开始。

答案 3 :(得分: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;
}