如何使这两种方法更有效

本文关键字:有效 方法 两种 何使这 | 更新日期: 2023-09-27 18:09:02

大家好,这是我在SO上的第一个问题,所以请对我宽容一点。

我正在玩Lambda/LINQ,同时构建自己的几个实用程序方法。

  1. 第一个方法接受像

    这样的字符串
    "AdnanRazaBhatti" 
    

    ,然后像

    一样分开
    "Adnan Raza Bhatti"
    
  2. 第二个方法像第一个方法一样接受字符串,也接受

    out String[] brokenResults 
    

    并像第一个方法一样返回破碎的字符串,并像下面那样填充破碎的results数组。

      "Adnan" "Raza" "Bhatti"
    
<标题>问题:

。你能建议一下如何使这些方法更有效吗?

B。当我尝试使用StringBuilder它告诉我扩展方法,如,在哪里,选择不存在StringBuilder类,为什么这样?虽然indexer在StringBuilder上工作以获得StringBuilder s = new StringBuilder ("Dang");c = s[0];这里char将是D;

<标题> 代码

方法一:

  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;
    }

方法二:

  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",我将使用其中一种方法将其分解为"BooksId"编程,我知道还有其他方法或重命名列名,如在设计窗口或[dataset].[tableName]. headersrow . cells[0]。Text = "Books Id",但我也计划在将来的其他地方使用这个方法。

谢谢

如何使这两种方法更有效

您可以使用以下扩展方法根据大写字母拆分字符串:

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

检查此代码

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

希望这个答案对你有所帮助。如果你找到了答案,请标记我的答案并指出来。

在我看来正则表达式是可行的。

我想从[a-z] [a-z]+开始可能比较好。

更新版本。字符串生成器用于减少内存占用。

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;
}