给定字符串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;
        }

解决方案 »

  1.   

    找一个字符变量存p1位置的字符
    p1地址赋值p2位置的字符,p2地址赋值字符变量
    也比使用字符串加起来好的多(如果p1,p2没超出字符串长度的话)
      

  2.   

    static  void SwapChar(ref string s, int i1, int i2)
            {
                char temp = s[i1];
                char temp1 = s[i2];
                s = s.Remove(i1, 1).Insert(i1, temp1.ToString());
                s = s.Remove(i2, 1).Insert(i2, temp.ToString());
            }
      

  3.   

    static string SwapChar(string s, int p1, int p2)
    {
        if ((p1 == p2) || ((p1 < 0) || (p2 < 0))) return s;
        if ((p1 >= s.Length) || (p2 >= s.Length)) return s;
        char[] vChars = s.ToCharArray();
        vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
        return new string(vChars);
    }
      

  4.   

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

  5.   

    WA。高手果然很多!
    jx0797(...) 
    zswang(伴水清清)(专家门诊清洁工) 
    he_8134(只有星星伴明月) 
    谢谢你们!!!!
      

  6.   

    回复:bitpolar(独自看天)
    任何一段代码都极有可能成有系统的瓶颈。而且我前给出的非常丑的代码只是能完成事情,而且很不好地完成了,会有很多问题的。
    jx0797(...) 让我明白了可以用Remove方法和Insert方法来完成,绝!
    zswang(伴水清清)(专家门诊清洁工) 短短几行可以看出此人“功力”非凡。代码写得滴水不漏!高人啊。
    he_8134(只有星星伴明月) 直接了当,应当可以成为论坛或者教学最佳回答。因为看一眼就明白,看完就会。真是太强啦。
      

  7.   

    char[] newStr = str.ToCharArray();
                newStr[a] = str[b];
                newStr[b] = str[a];
                return new string(newStr);
    不錯
      

  8.   

    zswang(伴水清清)(专家门诊清洁工)的“vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);”有问题,达不到交换的效果,可以改成:
    static string SwapChar(string s, int p1, int p2)
        {
            if ((p1 == p2) || ((p1 < 0) || (p2 < 0))) return s;
            if ((p1 >= s.Length) || (p2 >= s.Length)) return s;
            char[] vChars = s.ToCharArray();
            vChars[p1] = s[p2];
            vChars[p2] = s[p1];
            return new string(vChars);
        }
      

  9.   


    using System.Text.RegularExpressions;static string SwapChar(string s, int p1, int p2)
    {
    if (p1 > p2) { int p = p1; p1 = p2; p2 = p; }
    return Regex.Replace(s, "^(.{" + p1 + "})(.)(.{" + (p2 - p1 - 1) + "})(.)(.*)$", "$1$4$3$2$5");
    }
      

  10.   

    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);
            }  
    星星的方法可读性强
    :)
      

  11.   

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

  12.   

    终于,出现了正则表达式的做法!
    谢谢 0009(夏天以南) 
    回sunrobust(咸鱼---翻身理想不灭) 
    关于StringBuilder
      <.NET框架程序设计> 这本书对StringBuilder推崇有加。但是<C#高级编程>里有一句话“StringBuilder只是string类的子集”大约的意思是说StringBuilder可以做的,string本身就已经可以做了。
      

  13.   

    三个星的高手出现了
    hertcloud(·£孙子兵法£·)
    应当是工业界最终会采用的做法,代码可读性好,严谨。
      

  14.   

    hertcloud(·£孙子兵法£·) 的已经是最漂亮的了  <.NET框架程序设计> 这本书对StringBuilder推崇有加。但是<C#高级编程>里有一句话“StringBuilder只是string类的子集”大约的意思是说StringBuilder可以做的,string本身就已经可以做了。
    ----------------
    尽信书不如无书...关于 String & StringBuilderString 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
    String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。
      

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

  16.   

    //写一个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();
    }
      

  17.   

    return charArr.ToString();结果为System.Char[],所以不能用hertcloud(·£孙子兵法£·)
    的返回语句
      

  18.   

    bukater(我是新来的) return charArr.ToString();结果为System.Char[],所以不能用hertcloud(·£孙子兵法£·)
    的返回语句
    --------------------------------------------------------------------------------
    ???
      

  19.   

    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);
    }写一个从火星转来的
      

  20.   

    应该改为  return new string(charArr);
      

  21.   

    请教各位高手,这个问题能解决吗?http://community.csdn.net/Expert/topic/5397/5397555.xml?temp=.3033563
      

  22.   

    function ReplaceDemo(){
       var r, re;                   
       var ss = "The man hit the ball with the bat.\n";
       ss += "while the fielder caught the ball with the glove.";
       re = /The/g;                
       r = ss.replace(re, "A");
       return(r)
    ;
      

  23.   

    俺是正则白痴
    谁给解释下
    using System.Text.RegularExpressions;static string SwapChar(string s, int p1, int p2)
    {
    if (p1 > p2) { int p = p1; p1 = p2; p2 = p; }
    return Regex.Replace(s, "^(.{" + p1 + "})(.)(.{" + (p2 - p1 - 1) + "})(.)(.*)$", "$1$4$3$2$5");
    }
      

  24.   

    SwapChar("0123456789", 2, 9)
    比如参数是2,9
    得到如下正则:
    (.{2})(.)(.{6})(.)(.*)$$2和$4交换即可//. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
    //当出现\n的时候这个代码就会出现问题。
    这样估计就没问题了
    return Regex.Replace(s, "^([\\w\\W]{" + p1 + "})([\\w\\W])([\\w\\W]{" + 
        (p2 - p1 - 1) + "})([\\w\\W])([\\w\\W]*)$", "$1$4$3$2$5");
      

  25.   

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

  26.   


    public static string ReplaceString(string str,int a,int b) {
                str[a]^=str[b]^=str[a]^=str[b];  
                return str;
            }
      

  27.   

    ==^_^好热闹==
    1.关于return charArr.ToString();这一句是不Work的,返回的是个字符串,可是串的内容是"System.Char[]"
    2.关于a = (char)(b | (b = a) & 0);我还是不太明白这样写有什么“历史”原因。不过这也的确是zswang(伴水清清)(专家门诊清洁工)的“滴水不漏”的一部分。if (p1 == p2 || p1 < 0 || p2 < 0 || p1 >= inStr.Length || p2 >= inStr.Length) 已经可以保证p1 p2不会取到结尾符了吧?当然,代码世界里的事情通常不是我们想像的这么简单吧,“凡是可能出错的地方就一定会出错”呢。
    3.火星人的解法偶看得有点晕。写手果然来自火星。C#或者说.NET Framework本来就是支持Unicode的,为什么“火星人”的代码看起来专门为Unicode做了这么多事情。不解。看起来“火星人”又是在写COM或者COM+或者.NET Remoting组件?“火星人”就是“火星人”:(
    4.ls是何门何派?算法版的高手们么?
    5.Oh...My...God...sycnick(李小虾) 的第二个算法“看上去很美”不过根本就不会Work的。不过还是谢谢小虾的热情。
      

  28.   

    zswang(伴水清清)(专家门诊清洁工)
    vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
    看不懂,讲一下吧。
      

  29.   

    to hxDreamer:
    这样看就明白了
    int a = 1;
    int b = 2;
    a = b + (b = a) * 0;
    //a = b | (b = a) & 0;
    //a ^= b ^ (b ^= a ^ b);
    Console.WriteLine("a={0},b={1}", a, b);from
    http://community.csdn.net/Expert/topic/4899/4899577.xml?temp=.4270136
      

  30.   

    原来a=b|(b=a)&0还有这样的历史。。
      

  31.   

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

  32.   

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

  33.   

    为什么没有人判断传入的字符串是否为null呢?
    :)
      

  34.   

    lovefootball问得好,还要加一句(断言):
    System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(sourceString));tuyile006(小y) ( )的程序也是不WORK的
    21aspnet(清清月儿) --看起来程序是可以用的。谢谢。