西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发C#.NET → .net中直接修改临时字符串

.net中直接修改临时字符串

相关软件相关文章发表评论 来源:西西整理时间:2012/5/10 23:00:59字体大小:A-A+

作者:佚名点击:16次评论:1次标签: 字符串

  • 类型:电子教程大小:9.5M语言:中文 评分:8.0
  • 标签:
立即下载

有时候我们需要对字符串进行修改,但是.net里面的字符串是只读的,修改动作会产生一个新的字符串,多数时候这都不是我想要的结果。不过fixed还是可以帮我们解决一部分问题的,比如.ToLower、.ToUpper、.Replace(char, char)等等,不过有个限制,就是变换前后的字符串长度不变。

        public unsafe static string toLower(this string value)
        {
            if (value != null)
            {
                fixed (char* valueFixed = value) toLowerUnsafe(valueFixed, valueFixed + value.Length);
            }
            return value;
        }
        public unsafe static void toLower(char* start, char* end)
        {
            if (start != null && end > start) toLowerUnsafe(start, end);
        }
        public unsafe static void toLowerUnsafe(char* start, char* end)
        {
            while (start != end)
            {
                if ((uint)(*start - 'A') < 26) *start |= (char)0x20;
                ++start;
            }
        }

        public unsafe static string toUpper(this string value)
        {
            if (value != null)
            {
                fixed (char* valueFixed = value) toUpperUnsafe(valueFixed, valueFixed + value.Length);
            }
            return value;
        }
        public unsafe static void toUpper(char* start, char* end)
        {
            if (start != null && end > start) toUpperUnsafe(start, end);
        }
        public unsafe static void toUpperUnsafe(char* start, char* end)
        {
            while (start != end)
            {
                if ((uint)(*start - 'a') < 26) *start -= (char)0x20;
                ++start;
            }
        }

        public static string replace(this string value, char oldChar, char newChar)
        {
            return value != null && value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : null;
        }
        public unsafe static string replaceNotNull(this string value, char oldChar, char newChar)
        {
            return value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : value;
        }
        public unsafe static string replaceUnsafe(this string value, char oldChar, char newChar)
        {
            fixed (char* valueFixed = value)
            {
                char* start=valueFixed, end = valueFixed + value.Length;
                char endValue = *--end;
                *end = oldChar;
                do
                {
                    while (*start != oldChar) ++start;
                    *start = newChar;
                }
                while (start++ != end);
                if (endValue != oldChar) *end = endValue;
            }
            return value;
        }

Release实测,效果还不错,英文大小写转换运行时间降到了.ToLower与.ToUpper的1/4以下,字符替换运行时间降到了.Replace(char, char)的1/5以下,同时给垃圾回收也减少了很多压力。当然.ToLower与.ToUpper还是比较强大的,它不仅仅只是英文转换,但是我个人只处理过英文大小写问题。
需要注意的是,这里是直接修改字符串的数据,会影响到所有相关引用,如果对影响程度没有把握,一般建议应用在一次性的临时变量上。这里只是举几个例子,具体其它可能的字符串修改应用就需要你自己却发掘了。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)