简单问题欢迎抢分:C#字符串怎样交换两个指定位置字符(求最漂亮的做法)

stonepeter 2007-03-14 06:46:17
给定字符串s,以及两个位置(整数)p1,p2,有没有比较漂亮的方法完成数据交换
如:s="abcde",p1=2,p2=4 要求结果得到字符串"abedc"
--------我的做法------欢迎抢分!!!------
static string SwapChar(ref string s, int p1, int p2)
{
string ret;

if (p1 == p2) return s;

if (p1 > p2) { int p = p1; p1 = p2; p2 = p; } //Swap p1,p2

ret = s.Substring(0, p1) + s[p2];
ret += s.Substring(p1 + 1 , p2 - p1 - 1) + s[p1];
ret += s.Substring(p2 + 1 , s.Length - p2 -1 );
return ret;
}
...全文
1925 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
深度Java 2007-03-16
  • 打赏
  • 举报
回复
class myPreviousExp
{
private string[] myCompanies = new string[5];
public string this[int index]
{
get
{
return myCompanies[index];
}
set
{
myCompanies[index] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
string s = "abcde"; int p1 = 2; int p2 = 4;
myPreviousExp indexerObj = new myPreviousExp();
indexerObj[0] = s.Substring(0, p1);
indexerObj[1] = s.Substring(p1, 1);
indexerObj[2] = s.Substring(p2, 1);
indexerObj[3] = s.Substring(p1+1, p2 - p1 - 1);
indexerObj[4] = s.Substring(p2+1);
Console.WriteLine(indexerObj[0] + indexerObj[2] + indexerObj[3] + indexerObj[1] + indexerObj[4]);
}

}
stonepeter 2007-03-16
  • 打赏
  • 举报
回复
lovefootball问得好,还要加一句(断言):
System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(sourceString));

tuyile006(小y) ( )的程序也是不WORK的
21aspnet(清清月儿) --看起来程序是可以用的。谢谢。
lovefootball 2007-03-16
  • 打赏
  • 举报
回复
为什么没有人判断传入的字符串是否为null呢?
:)
lovehongyun 2007-03-16
  • 打赏
  • 举报
回复
up
leafsword_519 2007-03-16
  • 打赏
  • 举报
回复
谢谢zswang(伴水清清)兄!!
阿非 2007-03-15
  • 打赏
  • 举报
回复
应该改为 return new string(charArr);
王集鹄 2007-03-15
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;

//....

internal delegate int DSwapChar(byte[] d, int p1, int p2);
static string SwapChar(string s, int p1, int p2)
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0)) || // 这个参数判断是不能少的
(p1 >= s.Length) || (p2 >= s.Length)) return s;
byte[] vBuffer = {
0x55, 0x8B, 0xEC, 0x53, 0x56, 0x8B, 0x4D, 0x10, 0x8B, 0x55,
0x0C, 0x8B, 0x45, 0x08, 0x66, 0x8B, 0x1C, 0x50, 0x66, 0x8B,
0x34, 0x48, 0x66, 0x89, 0x34, 0x50, 0x66, 0x89, 0x1C, 0x48,
0x5E, 0x5B, 0x5D, 0xC2, 0x0C, 0x00
};
IntPtr vProcAddress = Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0);
DSwapChar fSwapChar = Marshal.GetDelegateForFunctionPointer(
vProcAddress, typeof(DSwapChar)) as DSwapChar;
byte[] vData = Encoding.Unicode.GetBytes(s);
fSwapChar(vData, p1, p2);
return Encoding.Unicode.GetString(vData);
}

写一个从火星转来的
小y的CSDN博客 2007-03-15
  • 打赏
  • 举报
回复
static string CSwap(string inStr, int p1, int p2)
{
if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >=inStr.Length)
return inStr;

string newStr = inStr;
newStr[p1] = inStr[p2];
newStr[p2] = inStr[p1];
return newStr;
}
阿非 2007-03-15
  • 打赏
  • 举报
回复
bukater(我是新来的)

return charArr.ToString();结果为System.Char[],所以不能用hertcloud(·£孙子兵法£·)
的返回语句
--------------------------------------------------------------------------------
???
bukater 2007-03-15
  • 打赏
  • 举报
回复
return charArr.ToString();结果为System.Char[],所以不能用hertcloud(·£孙子兵法£·)
的返回语句
王集鹄 2007-03-15
  • 打赏
  • 举报
回复
//写一个StringBuilder的

static string SwapChar(string s, int p1, int p2)
{
if ((p1 == p2) || ((p1 < 0) || (p2 < 0)) || // 这个参数判断是不能少的
(p1 >= s.Length) || (p2 >= s.Length)) return s;
StringBuilder vStringBuilder = new StringBuilder(s);
vStringBuilder.Replace(s[p1], s[p2], p1, 1);
vStringBuilder.Replace(s[p2], s[p1], p2, 1);
return vStringBuilder.ToString();
}
jinanjiang 2007-03-15
  • 打赏
  • 举报
回复
学习
王集鹄 2007-03-15
  • 打赏
  • 举报
回复
//>zswang(伴水清清)(专家门诊清洁工)的“vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);”有问题,达不到交换的效果,可以改成:

//to dubingw2008,持怀疑态度是对的,但得调试过再说话

char a = 'a';
char b = 'b';
a = (char)(b | (b = a) & 0);
Console.WriteLine("a={0},b={1}", a, b);
stonepeter 2007-03-15
  • 打赏
  • 举报
回复
原来a=b|(b=a)&0还有这样的历史。。。。。
vrhero 2007-03-15
  • 打赏
  • 举报
回复
hertcloud(·£孙子兵法£·) 的已经是最漂亮的了

<.NET框架程序设计> 这本书对StringBuilder推崇有加。但是<C#高级编程>里有一句话“StringBuilder只是string类的子集”大约的意思是说StringBuilder可以做的,string本身就已经可以做了。
----------------
尽信书不如无书...

关于 String & StringBuilder

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
stonepeter 2007-03-15
  • 打赏
  • 举报
回复
三个星的高手出现了
hertcloud(·£孙子兵法£·)
应当是工业界最终会采用的做法,代码可读性好,严谨。
stonepeter 2007-03-15
  • 打赏
  • 举报
回复
终于,出现了正则表达式的做法!
谢谢 0009(夏天以南)
回sunrobust(咸鱼---翻身理想不灭)
关于StringBuilder
<.NET框架程序设计> 这本书对StringBuilder推崇有加。但是<C#高级编程>里有一句话“StringBuilder只是string类的子集”大约的意思是说StringBuilder可以做的,string本身就已经可以做了。

hertcloud 2007-03-15
  • 打赏
  • 举报
回复
static string CSwap(string inStr, int p1, int p2)
{
if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >= inStr.Length)
return inStr;

char[] charArr = inStr.ToCharArray();
char tmp = charArr[p1];
charArr[p1] = charArr[p2];
charArr[p2] = tmp;
return charArr.ToString();
}
ga3ga3 2007-03-15
  • 打赏
  • 举报
回复 1
he_8134(只有星星伴明月) ( ) 信誉:100 Blog 2007-3-14 19:10:21 得分: 0



public static string ReplaceString(string str,int a,int b) {
char[] newStr = str.ToCharArray();
newStr[a] = str[b];
newStr[b] = str[a];
return new string(newStr);
}


星星的方法可读性强
:)
wzq6511 2007-03-15
  • 打赏
  • 举报
回复
偶来接分....
加载更多回复(28)
内附1-19章的实战程序。 目录 第1章 c#语言及其开发环境 实例001 根据需要创建所需解决方案 实例002 统一窗体中控件的字体设置 实例003 设置程序代码行号 实例004 通过“格式”菜单布局窗体 实例005 为项目添加dll文件引用 实例006 为项目添加已有类 实例007 为项目添加第三方控件 实例008 为项目添加已有窗体 第2章 c#语言基础 实例009 利用for循环输出多行语句 实例010 输入并输出姓名 实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是星期几 实例013 定义局部变量输出不同的字段 实例014 定义循环内部变量并输出变量的值 实例015 定义常量计算圆的周长 实例016 使用“+”编写双重意义的表达式 实例017 使用小括号括起来的表达式 实例018 使用算术运算符开发简单计算器 实例019 使用条件运算符判断指定年份是不是闰年 实例020 使用typeof关键字获取类的内部结构 实例021 巧用位移运算符获取汉字编码值 实例022 使用异或运算符对数字进行加密 第3章 流程控制语句 实例023 利用if…else语句判断分数是否及格 实例024 利用switch语句判断时间 实例025 利用while语句判断大小 实例026 打印九九乘法表 实例027 使用break语句提前退出循环语句 实例028 使用continue语句转移至循环开始处 实例029 使用流程控制语句报销业务花销 实例030 输出当前系统时间 实例031 利用for循环实现完数计算 实例032 开发一个猜数字游戏 第4章 字符字符 实例033 字母与ascii码的转换 实例034 获取字符中汉字的个数 实例035 从字符中分离文件路径、文件名及扩展名 实例036 对字符进行加密与解密 实例037 开发一个进制转换器 实例038 将字符的每个字符进行颠倒输出 实例039 根据标点符号对字符进行分行 实例040 将汉字转换为拼音 实例041 商品金额的大小写转换 实例042 根据年份判断十二生肖 实例043 将字母全部转换为大写或小写 实例044 汉字与区位码的转换 第5章 数组和集合 实例045 在数组中添加一个元素 实例046 在数组中添加一个数组 实例047 计算两个矩形矩阵的乘积 实例048 获取多维数组的行数与列数 实例049 使用快速排序法对一维数组进行排序 实例050 使用sort方法对数组进行快速排序 实例051 按指定条件在数组中检索元素 实例052 反转数组中元素的顺序 实例053 使用希尔排序法对一维数组进行排序 实例054 向班级集合中添加学生信息 实例055 不改变长度删除数组中的元素 实例056 删除数组元素后改变其长度 第6章 c#面向对象程序设计 实例057 创建类的对象 实例058 使用构造函数 实例059 通过定义方法一个数的平方 实例060 使用重载方法实现不同类型数据的计算 实例061 使用属性存储用户编号和姓名 实例062 使用索引器 实例063 通过类继承计算梯形面积 实例064 封装类实现一个简单的计算器 实例065 通过结构计算矩形的面积 实例066 通过结构计算圆形的面积 实例067 使用面向对象思想查找字符中的所有数字 实例068 通过类的多态性确定人类的说话行为 第7章 异常处理和程序调试 实例069 使用try…catch语句捕获异常 实例070 根据实际年龄判断虚岁,使用try…catch捕获异常 实例071 调试程序执行时出现的结果 实例072 使用异常处理语句捕获异常 实例073 捕获连接数据库异常 第8章 windows窗体 实例074 简单的登录窗体 实例075 关闭窗体提示 实例076 创建简单的mdi应用程序 实例077 实现重复高效地利用基窗体 实例078 尝试制作一个半透明渐显窗体 实例079 使窗体标题栏文字右对齐 实例080 窗口间移动按钮 实例081 窗体中滚动的字幕 实例082 使用任意组件拖动窗体 实例083 窗体换肤程序 第9章 windows应用程序常用控件 实例084 在c#中设计出色彩斑斓的按钮 实例085 自动删除textbox控件中的非法字符 实例086 在richtextbox控件中替换文本文字 实例087 利用richtextbox控件实现文字定位与标示 实例088 将数据表中的字段添加到combobox控件中 实例089 对listbox控件中的数据进行排序 实例090 listbox控件拒绝添加重复信息 实例091 限制用户名称长度及设置密码文本 实例092 带查询功能的combobox控件 实例093 利用选择控件实现权限设置 实例094 利用richtextbox控件显示图文数据 实例095 在listbox控件间交换数据 第10章 windows应用程序高级控件 实例096 使用imagelist组件制作动画图片 实例097 在combobox下拉列表中显示图片 实例098 在listview控件中实现修改功能 实例099 将数据库数据添加到listview控件 实例100 在listview控件中绘制底纹 实例101 在treeview控件节点中显示图片 实例102 使用树型列表动态显示菜单 实例103 使用treeview控件遍历磁盘目录 实例104 使用errorprovider组件验证文本框输入 实例105 使用helpprovider组件调用帮助文件 实例106 使listview控件中的选择项高亮显示 实例107 在列表视图中拖动视图项 实例108 实现带复选框的treeview控件 实例109 将xml文件节点绑定到treeview控件中 实例110 修改treeview控件的节点文本 第11章 c#面向对象高级技术 实例111 利用接口实现选择不同的语言 实例112 使用接口作为方法参数进行编程 实例113 自定义抽象类计算圆形的面积 实例114 重写抽象方法实现多态性 实例115 使用密封类密封登录用户信息 实例116 使用密封类封装个人身份证信息 实例117 使用迭代器显示公交车站点 实例118 通过迭代器实现文字的动态效果 实例119 使用分部类制作一个计算器 实例120 使用分部类显示员工信息 实例121 使用泛型存储不同类型的数据列表 实例122 使用泛型去掉数组中的重复数字 实例123 通过重写虚方法实现加法运算 实例124 使用迭代器实现倒序遍历 实例125 通过泛型查找数组中的元素 第12章 ado.net数据访问技术 实例126 连接加密的access数据库 实例127 使用odbc dsn连接sql server数据库 实例128 使用ado.net对象录入数据 实例129 利用存储过程录入数据 实例130 使用oledbdatareader读取文本文件的内容 实例131 使用sqldatareader读取用户登录信息 实例132 使用断开式连接的方式录入数据 实例133 使用断开式连接批量更新数据库中的数据 实例134 使datagridview控件中被选定单元格的所在行变色 实例135 在datagridview控件中隔行换色 实例136 连接excel文件 实例137 读取和保存用户头像 实例138 判断是否重复输入数据 实例139 删除datagridview控件中的指定行 实例140 将access数据库导入excel文件中 第13章 水晶报表与打印 实例141 设计带有背景图的水晶报表 实例142 设置水晶报表的打印日期与时间 实例143 设置水晶报表中节的背景图片 实例144 打印窗体中的数据 实例145 打印商品入库单据 实例146 使用打印控件实现分页打印 实例147 动态绑定水晶报表 实例148 在水晶报表中使用公式字段 实例149 设计分组统计报表 实例150 打印一个空学生证 实例151 自定义横向或纵向打印 实例152 自定义打印页码范围 第14章 文件及数据流技术 实例153 根据日期动态建立文件 实例154 将长文件名转换成短文件名 实例155 获取所有逻辑磁盘目录 实例156 使用递归法删除文件夹中的所有文件 实例157 按行读取文本文件中的数据 实例158 使用缓冲流复制文件 实例159 文件批量更名 实例160 复制文件时显示复制进度 实例161 对指定文件夹中的文件进行分类存储 实例162 将文本文件转换成网页文件 实例163 伪装文件夹 实例164 word目录提取工具 第15章 gdi+绘图 实例165 在图像中实现自定义标记 实例166 辉光效果的文字 实例167 渐变效果的文字 实例168 绘制多边形 实例169 简单画图程序 实例170 仿qq截图功能 实例171 模拟石英钟 实例172 绘制贝塞尔曲线 实例173 绘制图形验证码 实例174 以椭圆形显示图像 实例175 使用双缓冲技术绘图 实例176 批量添加图片水印 第16章 线程的使用 实例177 使用线程读取数据库中的数据 实例178 使用线程制作qq农场小游戏 实例179 使用线程实现大容量数据的计算 实例180 使用多线程制作端口扫描工具 实例181 使用线程扫描局域网ip地址 实例182 使用线程休眠控制图片以百叶窗效果显示 实例183 使用线程控制向窗体中拖放图片并显示 实例184 使用线程制作动画效果的状态栏 实例185 使用线程遍历文件夹 实例186 使用线程实现从左向右以拉伸的方式显示图像 第17章 网络编程技术 实例187 通过ip地址获取主机名称 实例188 创建web页面浏览器 实例189 获取网络信息及流量 实例190 远程关闭与重启计算机 实例191 设计点对点聊天程序 实例192 电子邮件的发送与接收 实例193 获取网络中所有工作组名称 实例194 列出指定工作组中的所有计算机名 实例195 监测当前网络连接状态 实例196 使用udp协议设计聊天室 第18章 注册表技术 实例197 禁止运行注册表 实例198 使应用程序开机自动运行 实例199 获取本机安装的软件清单 实例200 禁止使用windows任务管理器 实例201 清除ie地址栏中的历史网址 实例202 将磁盘驱动器隐藏 实例203 禁止使用命令提示符 实例204 禁止修改ie浏览器主页 实例205 设置ie浏览器的默认主页 实例206 设置ie浏览器的默认下载路径 第19章 c#语言新技术 实例207 使用隐式类型局部变量实现字母的大小写转换 实例208 使用扩展方法显示员工信息 实例209 使用lambda表达式查找指定字符 实例210 检查序列中是否包含指定元素 实例211 使用linq在一个循环中遍历多个数组 实例212 过滤文章中包含指定单词的句子 实例213 使用linq生成随机序列 实例214 筛选指定类型的元素 实例215 使用linq技术对对象进行筛选操作 实例216 使用linq技术对对象进行排序操作 实例217 使用linq技术对对象进行聚合操作 实例218 使用linq技术对对象进行联接操作 第20章 windows应用程序打包部署 实例219 打包程序时设置桌面图标 实例220 打包.net framework 4.0框架
1. 声明两个变量:int n1 = 10, n2 = 20;要将两个变量交换,最后输出n1为20,n2为10。扩展(*):不使用第三个变量如何交换? 2. 用方法来实现:将上题封装一个方法来做,方法有两个参数分别为num1,num2,将num1与num2交换。提示:方法有两个参数n1,n2,在方法中将n1与n2进行交换,使用ref。(*) 3. 请用户输入一个字符,计算字符中的字符个数,并输出。 4. 用方法来实现:计算两个数的最大值。思考:方法的参数?返回值?扩展(*):计算任意多个数间的最大值(提示:使用可变参数,params)。 5. 用方法来实现:计算1-100之间的所有整数的和。 6. 用方法来实现:计算1-100之间的所有奇数的和。 7. 用方法来实现:判断一个给定的整数是否为“质数”。 8. 用方法来实现:计算1-100之间的所有质数(素数)的和。 9. 用方法来实现:有一个整数数组:{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 },找出其中最大值,并输出。不能调用数组的Max()方法。 10. 用方法来实现:有一个字符数组:{ "马龙", "迈克尔乔丹", "雷吉米勒", "蒂姆邓肯", "科比布莱恩特" },请输出最长的字符。 11. 用方法来实现:请计算出一个整型数组的平均值。{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }。要:计算结果如果有小数,则显示小数点后两位(四舍五入)。Math.Round() 12. 请通过冒泡排序法对整数数组{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }实现升序排序。 13. 有如下字符:【"患者:“大夫,我咳嗽得很重。” 大夫:“你多大年记?” 患者:“七十五岁。” 大夫:“二十岁咳嗽吗”患者:“不咳嗽。” 大夫:“四十岁时咳嗽吗?” 患者:“也不咳嗽。” 大夫:“那现在不咳嗽,还要等到什么时咳嗽?”"】。需:①请统计出该字符中“咳嗽”二字的出现次数,以及每次“咳嗽”出现的索引位置。②扩展(*):统计出每个字符的出现次数。 14. 将字符" hello world,你 好 世界 ! "两端空格去掉,并且将其中的所有其他空格都替换成一个空格,输出结果为:"hello world,你 好 世界 !"。 15. 制作一个控制台小程序。要:用户可以在控制台录入每个学生的姓名,当用户输入quit(不区分大小写)时,程序停止接受用户的输入,并且显示出用户输入的学生的个数,以及每个学生的姓名。效果如图:

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧