如何给含有字母和数字的字符串中的数字排序,字母位置不能改变?例如str="b3a657d8"排序后为str="b3a567d8".

解决方案 »

  1.   

                string str = "b3a657d8";
                List<Char> list = new List<char>();
                foreach (Char chr in str)
                {
                    if (char.IsDigit(chr))
                        list.Add(chr);
                }
                list.Sort();
                StringBuilder sb = new StringBuilder();
                for (int i = 0,j=0; i < str.Length; i++)
                {
                    if (char.IsDigit(str[i]))
                    {
                        sb.Append(list[j++]);
                    }
                    else
                    {
                        sb.Append(str[i]);
                    }
                }
                str = sb.ToString();
      

  2.   

    list排完序后执行一下: list.Reverse();
      

  3.   

    这基本就是两趟扫描。using System;
    using System.Linq;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var str = "b3a657d8";
                var pos = 0;
                var result = str.Aggregate(str.Where(c => c >= '0' && c <= '9')
                                                .OrderByDescending(c => c)
                                                .ToList(),
                    (container, c) =>
                    {
                        if (c < '0' || c > '9')
                            container.Insert(pos, c);
                        pos++;
                        return container;
                    });
                Console.Write(result.ToArray());
                Console.ReadKey();
            }
        }
    }
      

  4.   

    我可能会更喜欢正则表达式一些
    var input = "2afbc532dfa071761adf";
    var result = new Regex(@"\d{2,}")
    .Replace(
    input,
    (match => new string(match.Value.ToCharArray().OrderBy(c => c).ToArray<char>()))
    );
    Console.WriteLine(result);
    结果:
    2afbc235dfa011677adf
      

  5.   

                var arr = "b3a657d8".ToArray();            var strEnumerator = arr.Where(c => char.IsNumber(c))
                                        .OrderBy(c => c).GetEnumerator();            for (int i = 0; i < arr.Count(); i++)
                    if (char.IsNumber(arr[i]))
                    {
                        strEnumerator.MoveNext();
                        arr[i] = strEnumerator.Current;
                    }            var str = string.Join("", arr);
                Console.WriteLine(str);