C#用StringBuilder高效处理字符串_c# stringbuilder-程序员宅基地

技术标签: C#  c#  jvm  java  

目录

一、背景

二、使用StringBuilder便捷、高效地操作字符串

三、实例

1.源码

2.生成效果

四、实例中知识点

1.StringBuilder 构造函数

(1)定义

(2)重载

(3)StringBuilder()

(4)StringBuilder(Int32)

(5)StringBuilder(String)

(6)StringBuilder(Int32, Int32)

(7)StringBuilder(String, Int32)

(8)StringBuilder(String, Int32, Int32, Int32)

2.StringBuilder属性

3.StringBuilder方法

2.Environment.NewLine 属性


一、背景

        符串是不可改变的对象,字符串在创建以后,就不会被改变,当使用字符串对象的Replace、split或Remove等方法操作字符串时,实际上是产生了一个新的字符串对象,原有的字符串如果没有被引用,将会被垃圾收集器回收。如果频繁地使用字符串中的方法对字符串进行操作,会产生大量的没有被引用的字符串对象,这会增加垃圾收集的压力,造成系统资源的浪费。

二、使用StringBuilder便捷、高效地操作字符串

        因为使用StringBuilder操作字符串不会产生新的字符串对象,在使用StringBuilder对象前首先要引用命名空间System.Text。

        由于字符串的不可变性,使用StringBuilder操作字符串无疑是非常方便和有效的方法。StringBuilder对象的使用方法:

StringBuilder P_stringbuilder = new StringBuilder("abc");  //使用new关键字调用构造方法创建对象
P_stringbuilder.Insert(2,Environment.NewLine);             //调用对象的Insert方法向字符串中插入字符

        建立StringBuilder对象后,可以调用操作字符串的方法,从而方便操作字符串对象适当地使用StringBuilder操作字符串,会使程序运行更加高效。

三、实例

1.源码

//按标点符号对字符串分行显示
using System.Text;

namespace _039
{
    public partial class Form1 : Form
    {
        private GroupBox? groupBox1;
        private TextBox? textBox3;
        private Button? button1;
        private TextBox? textBox1;
        private TextBox? textBox2;

        public Form1()
        {
            InitializeComponent();
            Load += Form1_Load;
        }
        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // textBox3
            // 
            textBox3 = new TextBox
            {
                Location = new Point(12, 22),
                Multiline = true,
                Name = "textBox3",
                Size = new Size(310, 46),
                TabIndex = 6,
                Text = "在下面文本框中输入字符串,并使用(,)号分隔,点击分行显示按钮,根据(,)号对字符串进行分行。"
            };
            // 
            // button1
            //      
            button1 = new Button
            {
                Location = new Point(130, 170),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 3,
                Text = "分行显示",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // textBox1
            //            
            textBox1 = new TextBox
            {
                Location = new Point(12, 80),
                Multiline = true,
                Name = "textBox1",
                Size = new Size(310, 84),
                TabIndex = 4
            };
            // 
            // textBox2
            //            
            textBox2 = new TextBox
            {
                Location = new Point(12, 200),
                Multiline = true,
                Name = "textBox2",
                Size = new Size(310, 84),
                TabIndex = 5
            };
            // 
            // groupBox1
            //            
            groupBox1 = new GroupBox
            {
                Location = new Point(0, 0),
                Name = "groupBox1",
                Size = new Size(334, 74),
                TabIndex = 0,
                TabStop = false,
                Text = "操作说明:"
            };
            groupBox1.Controls.Add(textBox3);
            groupBox1.SuspendLayout();
         
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(334, 296);
            Controls.Add(textBox2);
            Controls.Add(textBox1);
            Controls.Add(button1);
            Controls.Add(groupBox1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "按标点符号对字符串分行";
            groupBox1.ResumeLayout(false);
            groupBox1.PerformLayout();
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            StringBuilder stringbuilder = new(textBox1!.Text);      //创建字符串处理对象
            for (int i = 0; i < stringbuilder.Length; i++)
                if (stringbuilder[i] == ',')                       //判断是否出现(,)号
                    stringbuilder.Insert(++i, Environment.NewLine); //向字符串内添加换行符
            textBox2!.Text = stringbuilder.ToString();              //得到分行后的字符串
        }
    }
}

2.生成效果

 

四、实例中知识点

1.StringBuilder 构造函数

(1)定义

命名空间:
System.Text
程序集:
System.Runtime.dll
初始化 StringBuilder 类的新实例。

(2)重载

StringBuilder() 初始化 StringBuilder 类的新实例。
StringBuilder(Int32) 使用指定的容量初始化 StringBuilder 类的新实例。
StringBuilder(String) 使用指定的字符串初始化 StringBuilder 类的新实例。
StringBuilder(Int32, Int32) 初始化 StringBuilder 类的新实例,该类起始于指定容量并且可增长到指定的最大容量。
StringBuilder(String, Int32) 使用指定的字符串和容量初始化 StringBuilder 类的新实例。
StringBuilder(String, Int32, Int32, Int32) 从指定的子字符串和容量初始化 StringBuilder 类的新实例。

(3)StringBuilder()

        初始化 StringBuilder 类的新实例。

public StringBuilder ();
//以下示例演示如何在没有参数的情况下调用 StringBuilder 构造函数。
//此实例的字符串值设置为 String.Empty,容量设置为特定于实现的默认容量。
StringBuilder stringBuilder = new();

(4)StringBuilder(Int32)

        使用指定的容量初始化 StringBuilder 类的新实例。

public StringBuilder (int capacity);

参数
capacity
Int32
此实例的建议起始大小。

例外
ArgumentOutOfRangeException
capacity 小于零。
int capacity = 255;
StringBuilder stringBuilder = new(capacity);

        参数 capacity 定义当前实例分配的内存中可以存储的最大字符数。 其值分配给 Capacity 属性。 如果当前实例中要存储的字符数超过此值 capacity ,则 StringBuilder 对象会分配额外的内存来存储这些字符。此实例的字符串值设置为 String.Empty。 如果 capacity 为零,则使用特定于实现的默认容量。

(5)StringBuilder(String)

         使用指定的字符串初始化 StringBuilder 类的新实例。

public StringBuilder(string value);

参数
value
String
用于初始化实例值的字符串。 如果 value 为 null,则新的 StringBuilder 将包含空字符串(即包含 Empty)。
//如何使用指定的字符串调用 StringBuilder 构造函数。
//如果 value 为 null,则新的 StringBuilder 将包含空字符串(即包含 Empty)。
string initialString = "Initial string.";
StringBuilder stringBuilder = new(initialString);

(6)StringBuilder(Int32, Int32)

        初始化 StringBuilder 类的新实例,该类起始于指定容量并且可增长到指定的最大容量。

public StringBuilder (int capacity, int maxCapacity);

参数
capacity
Int32
StringBuilder 的建议起始大小。

maxCapacity
Int32
当前字符串可包含的最大字符数。

例外
ArgumentOutOfRangeException
maxCapacity 小于一,capacity 小于零,或 capacity 大于 maxCapacity。
//如何调用 StringBuilder 具有指定容量和最大容量的构造函数。
int capacity = 255;
int maxCapacity = 1024;
StringBuilder stringBuilder = new(capacity, maxCapacity);

        参数 capacity 定义当前实例分配的内存中可以存储的最大字符数。 其值分配给 Capacity 属性。 如果当前实例中要存储的字符数超过此值 capacity ,则 StringBuilder 对象会分配额外的内存来存储这些字符。

        如果 capacity 为零,则使用特定于实现的默认容量。

        属性 maxCapacity 定义当前实例可以容纳的最大字符数。 其值分配给 MaxCapacity 属性。 如果要存储在当前实例中的字符数超过此值 maxCapacity ,则 StringBuilder 对象不会分配额外的内存,而是引发异常。

(7)StringBuilder(String, Int32)

        使用指定的字符串和容量初始化 StringBuilder 类的新实例。

public StringBuilder (string value, int capacity);
参数
value
String
用于初始化实例值的字符串。 如果 value 为 null,则新的 StringBuilder 将包含空字符串(即包含 Empty)。

capacity
Int32
StringBuilder 的建议起始大小。

例外
ArgumentOutOfRangeException
capacity 小于零。
//如何使用初始字符串和指定的容量调用 StringBuilder 构造函数。
string initialString = "Initial string. ";
int capacity = 255;
StringBuilder stringBuilder = new(initialString, capacity);

        参数 capacity 定义当前实例分配的内存中可以存储的最大字符数。 其值分配给 Capacity 属性。 如果当前实例中要存储的字符数超过此值 capacity ,则 StringBuilder 对象会分配额外的内存来存储这些字符。

        如果 capacity 为零,则使用特定于实现的默认容量。

(8)StringBuilder(String, Int32, Int32, Int32)

         从指定的子字符串和容量初始化 StringBuilder 类的新实例。

public StringBuilder (string value, int startIndex, int length, int capacity);

参数
value
String
字符串包含用于初始化此实例值的子字符串。 如果 value 为 null,则新的 StringBuilder 将包含空字符串(即包含 Empty)。

startIndex
Int32
value 中子字符串开始的位置。

length
Int32
子字符串中的字符数。

capacity
Int32
StringBuilder 的建议起始大小。

例外
ArgumentOutOfRangeException
capacity 小于零。
- 或 -
startIndex 加 length 不是 value 中的位置。
//如何使用指定的字符串调用 StringBuilder 构造函数。
string initialString = "Initial string for stringbuilder.";
int startIndex = 0;
int substringLength = 14;
int capacity = 255;
StringBuilder stringBuilder = new(initialString, startIndex, substringLength, capacity);

        参数 capacity 定义当前实例分配的内存中可以存储的最大字符数。 其值分配给 Capacity 属性。 如果当前实例中要存储的字符数超过此值 capacity ,则 StringBuilder 对象会分配额外的内存来存储这些字符。

        如果 capacity 为零,则使用特定于实现的默认容量。

2.StringBuilder属性

3.StringBuilder方法

2.Environment.NewLine 属性

         等效于换行符。NewLine 自动追加到由 Console.WriteLine 和 StringBuilder.AppendLine 方法处理的文本。

提供 NewLine 的功能通常是换行符、换行符、换行符、回车符、CRLF 和行尾术语的含义。
命名空间:
System

程序集:
netstandard.dll

获取为此环境定义的换行字符串。

属性值
String
\r\n 对于非 Unix 平台或 \n Unix 平台。

        实例:

// 显示用换行符分隔的两行
namespace ConsoleApp2
{
    class Sample
    {
        public static void Main()
        {
            Console.WriteLine();
            Console.WriteLine($"NewLine: {Environment.NewLine}  first line{Environment.NewLine}  second line");
        }
    }
}

/*
运行结果:

NewLine:
  first line
  second line
*/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wenchm/article/details/135397349

智能推荐

会声会影2024新增六大新功能介绍-程序员宅基地

文章浏览阅读261次,点赞9次,收藏3次。1.产品定位上会声会影的优势,pr是专业的视频编辑软件,它适合影视编辑、电视节目的编排、媒体广告的设计等专业性比较强的工作。如今的世界已经进入了自媒体时代,每一个人都可以在自己的社交平台上发布自己的视频,在这样的时代下,什么样的视频编辑软件更好呢。综上所述,我通过介绍会声会影的这六点优势,来向大家说明,在这个自媒体时代,在面向普通人的群体时,会声会影无疑是一款更加优秀和细心的视频剪辑软件。从界面的复杂程度来看,pr要比会声会影的看上去更难,更让人无所适从,由此可见pr的友好性,即易操作性是低于会声会影的。_会声会影2024

python离线安装包如何安装,python可以离线安装包吗_python-3.7.9-amd64.exe-程序员宅基地

文章浏览阅读609次,点赞28次,收藏11次。这篇文章主要介绍了policycoreutils-python 离线安装,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。_python-3.7.9-amd64.exe

宏转录组分析揭示不同土壤生境中氮循环基因的表达-程序员宅基地

文章浏览阅读99次。目前,对土壤氮循环基因调控、空间栖息地和时间之间的相互作用缺乏全面的了解。_氮循环基因

MD5加密概述,原理及实现-程序员宅基地

文章浏览阅读10w+次,点赞274次,收藏1.2k次。MD5概述:MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。MD5主要特点:不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样(一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。比如主流使用的MD5将任意长度的“字节串映射为一个128bit的大整数..._md5

Apple Find My「查找」认证芯片找哪家,认准伦茨科技ST17H6x芯片-程序员宅基地

文章浏览阅读207次。Apple Find My Network”配件计划,将庞大的全球“Apple Find My Network”开放给使用伦茨科技ST17H6x Soc平台的第三方设备制造商,以便他们设计使用这项服务的产品。Apple「查找」Find My可通过庞大的“Apple Find My Network” 实现全球查找功能。使用伦茨科技ST17H6x芯片的设备接入Find My Network后,可添加到Find My APP新增的“项目”选项下,可适用于上千亿种使用场景,包括钱包、单车、帽子、背包等。

python鼠标交互绘制彩虹圆圈_python鼠标进行交互-程序员宅基地

文章浏览阅读860次。【代码】python鼠标交互绘制彩虹圆圈。_python鼠标进行交互

随便推点

android地图指定位置,Android 画板(canvas)画bit地图的时候如何指定绘画时的起始位置...-程序员宅基地

文章浏览阅读200次。Android 画板(canvas)画bitmap的时候怎么指定绘画时的起始位置?各位大神,先详细看我这个图和文字解释内容:(问题就在图中)好!看完之后,我就展示一下实现这些的相关代码,我再强调一下,在这里面就只有一个画板!里面的三个图片是先用Path画好矩阵形状,再把bitmap图片画进去的。下面是先画好矩阵形状的代码://画好矩阵模块privatevoidinitPath(){flo..._怎样让canvas 设置画布起始点

excel下划线转驼峰公式_xlsx 下划线转驼峰-程序员宅基地

文章浏览阅读2.2k次。懒惰是人类科技进步的原动力!背景:作为一个程序员,写mapper的时候要与实体类对应,而实体类是驼峰命名的,数据库表的字段是下划线,一个个手敲很是头疼,所以就想有没有什么办法可以直接拼出想要的效果来,果然,被我找到了好方法,excel公式。公式:=LEFT(A1,1)&MID(SUBSTITUTE(PROPER(A1),"_",""),2,100)效果图:..._xlsx 下划线转驼峰

js将文本复制(写入)剪贴板的两种常用方法_js复制文本到剪切板-程序员宅基地

文章浏览阅读4k次。js 操作剪切板_js复制文本到剪切板

NNDL 实验五 前馈神经网络(3)鸢尾花分类_softmax iris三分类-程序员宅基地

文章浏览阅读305次。NNDL 实验五 前馈神经网络(3)鸢尾花分类_softmax iris三分类

python--字符串、列表、元组、字典、集合_python 字符串 列表 元祖 字典 集合-程序员宅基地

文章浏览阅读107次。##1.字符串###1.1 使用单引双引号和三引号(可写多行)括起来,使用反斜杠\转义特殊字符###1.2 python3源码文件默认以utf-8编码,所有字符串都是unicode字符串###1.3 支持字符串拼接、截取等多种运算a = "hello"b = "python"print("a+b 输出结果:", a+b)#a+b 输出结果:hellopythonprint("a[1:4]输出结果:", a[1:4])#a[1:4]输出结果: ellstr1 = "I'm a stude_python 字符串 列表 元祖 字典 集合

关于intptr_t,64位linux系统中void *与int转换_linux下void* 可以强转为int使用-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏10次。intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。学习linux多线程时看别人的示例代码直接将void * 转化为int,在自己的程序中也这样写可是提示error: cast from 'void*' to 'int' loses precision [-fpermissive]。经过学习,在32位系统中上述转换是可以的,因为在32位系统中int_linux下void* 可以强转为int使用

推荐文章

热门文章

相关标签