【问题标题】:Is there a way in C# to replace a collection of characters with another collection respectively?C# 中有没有办法分别用另一个集合替换一个字符集合?
【发布时间】:2013-02-10 10:00:47
【问题描述】:

在 C# 中有没有办法将一个字符集合分别替换为另一个集合,如下所示:

"ABCDEF.KindOfReplace( "AE", "12"); // the result: "1BCD2F"

【问题讨论】:

    标签: .net regex string replace


    【解决方案1】:

    没有,但在我看来您的代码相当于:

    var myString = "ABCDEF";
    var newString = myString.Replace("A", "1").Replace("E", "2");
    

    您可能可以编写一个扩展方法来使它更好,但对于大型替换数组,它不会特别有效。

    编辑:

    正如下面的 cmets 中所指出的,在需要替换大量字符串/字符的情况下,您可以使用 StringBuilder

    【讨论】:

    • 如果集合很大,请使用StringBuilder 而不是String
    【解决方案2】:

    不,不是直接的。您必须使用字符串原语或正则表达式自己构建它。

    一个简单的实现可能是:

    public static string KindOfReplace(this string original, string charsToReplace, string replacements)
    {
        var replacementDic = charsToReplace.Select((ch,i) => new { ch, i }).ToDictionary(x => x.ch, x => replacements[x.i]);
        var result = original.Select(ch => replacementDic.ContainsKey(ch) ? replacementDic[ch] :ch);
        return new String(result.ToArray());
    }
    

    (以上是一个例子,记得为相同长度的字符串添加保护等)。

    【讨论】:

    • 在这里使用 Linq 不是我的首选,但我喜欢这种聪明的方法
    • 由于 string 只是 char 的可枚举,它似乎是最简单的方法 :-)
    【解决方案3】:

    没有开箱即用的此类功能。如果您手工制作某些东西,这可能是许多可能的解决方案之一。 它操作一个字符数组并使用IndexOfAny 来查找要替换的字符。

    public static string KindOfReplace( this string src, string find, string repl)
    {
        char[] target = src.ToCharArray();
        char[] findChars = find.ToCharArray();
        int finder = src.IndexOfAny(findChars);
        while(finder>-1)
        {
            int charFind = find.IndexOf(src[finder]);
            target[finder] = repl[charFind];
            finder = src.IndexOfAny(findChars, finder+1);
        }
        return new String(target);
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多