开发者

How to make these 2 methods more Efficient [closed]

Closed. This question is off-topic. It is not currently accepting answers.

Want to improve this question? Update the question so it's on-topic for Stack Overflow.

Closed 11 years ago.

Improve this question

Hi guys this is my first question ever on SO so please go easy on me.

I am playing with Lambda/LINQ while building myself few utility methods.

  1. First method takes string like,

    "AdnanRazaBhatti" 
    

    and breaks it up like ,

    "Adnan Raza Bhatti"
    
  2. Second Methods takes string like first method and also takes,

    out String[] brokenResults 
    

    and returns broken string like the first method as well as fill up brokenResults array as follows.

      "Adnan" "Raza" "Bhatti"
    

Questions:

A. Can you please suggest how to make these methods more efficient?

B. When I try to use StringBuilder it tells me extension methods like, Where, Select does not exist for StringBuilder class, why is it so? Although indexer works on StringBuilder to get the characters like StringBuilder s = new StrinBuilder("Dang"); char c = s[0]; Here char will be D;

Code

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

Method 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 && !St开发者_如何学Goring.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;
    }

Note:

I am planning to use these utility methods to break up the table column names I get from my database.

For Example if column name is "BooksId" I will break it up using one of these methods as "Books Id" programmatically, I know there are other ways or renaming the column names like in design window or [dataset].[tableName].HeadersRow.Cells[0].Text = "Books Id" but I am also planning to use this method somewhere else in the future.

Thanks


you can use the following extension methods to split your string based on Capital letters:

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])"));
    }

To split a string in a string array, you can use this:

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

If we take your example for consideration, the code will be as follows:

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


Check this code

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

Hope this answer helps you. If you find solution kindly mark my answer and point it up.


Looks to me like regular expressions is the way to go.

I think [A-Z][a-z]+ might be a good one to start with.


Updated version. String builder was used to reduce memory utilization.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜