Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使这两种方法更有效_C#_Asp.net_Linq_Stringbuilder - Fatal编程技术网

C# 如何使这两种方法更有效

C# 如何使这两种方法更有效,c#,asp.net,linq,stringbuilder,C#,Asp.net,Linq,Stringbuilder,嗨,伙计们,这是我的第一个问题,所以请对我放松点 我正在使用Lambda/LINQ,同时为自己构建一些实用方法 第一个方法采用字符串形式 "AdnanRazaBhatti" 然后把它分解成 "Adnan Raza Bhatti" 第二个方法采用与第一个方法类似的字符串 out String[] brokenResults 并像第一个方法一样返回断开的字符串,并按如下所示填充brokenResults数组 "Adnan" "Raza" "Bhatti" 问题: 你能建议如何使这

嗨,伙计们,这是我的第一个问题,所以请对我放松点

我正在使用Lambda/LINQ,同时为自己构建一些实用方法

  • 第一个方法采用字符串形式

    "AdnanRazaBhatti" 
    
    然后把它分解成

    "Adnan Raza Bhatti"
    
  • 第二个方法采用与第一个方法类似的字符串

    out String[] brokenResults 
    
    并像第一个方法一样返回断开的字符串,并按如下所示填充brokenResults数组

      "Adnan" "Raza" "Bhatti"
    
  • 问题: 你能建议如何使这些方法更有效吗

    B.当我尝试使用StringBuilder时,它告诉我,StringBuilder类不存在扩展方法,例如,Where,Select,为什么会这样?尽管indexer在StringBuilder上工作,以获得类似StringBuilders=new StrinBuilder(“Dang”)的字符;字符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;
        }
    
    公共静态字符串拆分资本(字符串源)
    {
    字符串结果=”;
    int i=0;
    //将所有大写字母分开
    var charUpper=source.Where(x=>char.IsUpper(x)).ToArray();
    //如果只有一个大写字母,那么它已经是原子的了。
    if(charUpper.Count()>1){
    var strLower=源分割(charUpper);
    foreach(strLower中的字符串s)
    如果(i
    方法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;
        }
    
    publicstaticstringsplitcapital(字符串源,out string[]brokenResults)
    {
    字符串结果=”;
    int i=0;
    var strUpper=source.Where(x=>char.IsUpper(x)).ToArray();
    if(strUpper.Count()>1){
    var strLower=源分割(strUpper);
    经纪结果=(
    从strLower的s
    其中i
    注: 我计划使用这些实用程序方法来分解从数据库中获取的表列名

    例如,如果列名为“BooksId”,我将以编程方式使用其中一种方法作为“BooksId”来分解列名,我知道还有其他方法或重命名列名,如在设计窗口或[dataset].[tableName].HeaderRow.Cells[0].Text=“Books Id”,但我也计划将来在其他地方使用此方法


    谢谢

    在我看来,正则表达式就是最好的选择


    我认为[A-Z][A-Z]+可能是一个不错的开始。

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

    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
    
    检查此代码

    public static string SeperateCamelCase(this string value) 
    {
      return Regex.Replace(value, "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1");
    } 
    
    公共静态字符串分隔CAMELCASE(此字符串值)
    {
    
    返回Regex.Replace(值“”((?更新版本)。字符串生成器用于降低内存利用率

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

    这可能更适合代码复查堆栈交换。仍然有一些打字错误,Wordify缺少()
    CapitalCase
    应该是
    CapitalCase
    @Davy8更新了答案。感谢您的帮助:D@reggie您应该尽可能编译正则表达式以提高性能,例如.private static readonly Regex SomeRegEx=new Regex@“(?)?
    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;
    }