C#常量字符串调用

时间:2015-08-09 11:36:00

标签: c#

我做了一些常量字符串:

public const string a_sub  = "S";
public const string b_sub  = "Y"; 
public const string c_sub  = "X"; 
public const string d_sub  = "W"; 
// ...

我有一个文字:

string str = "This is a test";

我想做类似的事情:

foreach(char c in str)
{
    str.Replace(c,c_sub);

让我们假装c是a,那么它将是:

str.Replace(c, a_sub);

如果c为d,那么它将是:

str.Replace(c, d_sub);

等等

}

但我无法找到办法,有些帮助..请?

6 个答案:

答案 0 :(得分:2)

使用Dictionary和Stringbuilder:

Dictionary<char, char> mapper = new Dictionary<char, char>
{
   {'a','S'},
   {'b','D'},
   .......
};

var str = "aaaaaaaabbbbbbbb";
var sb = new StringBuilder(str);
for (int i = 0; i < sb.Length; i++)
{
    sb[i] = mapper[sb[i]];
}
var newStr = sb.ToString(); // SSSSSSSSDDDDDDDD

答案 1 :(得分:2)

在字典中定义你的const

private static Dictionary<string, string> dict = new Dictionary<string, string>
{
    {"a", "S"},
    {"b", "Y"},
    {"c", "X"},
    ...
};

然后通过这个词典进行迭代

var str = "This is a test";
foreach (var c in dict)
{
    str = str.Replace(c.Key, c.Value);
}

答案 2 :(得分:1)

另一种方法。

通过使用反射和StringBuilder获取临时结果(这将有助于避免错误/重复替换)

string str = "This is a test";
StringBuilder  result = new StringBuilder();
for(int idx = 0; idx < str.Length; idx++)
{
    char newChar = str[idx];
    if (newChar != ' ')
    {
        string propName = string.Format("{0}_sub", newChar.ToString().ToLowerInvariant());
        // program is the name of your class...
        var field = typeof(Program).GetField(propName);
        if(field != null)
        {
            // where null in case of static class
            //replace with the name of the class where the consts are
            newChar = field.GetValue(null).ToString().ToCharArray()[0];
        }
    }

    result.Append(newChar);
}
str = result.ToString();

我觉得这个解决方案对初学者来说有点复杂,但更容易维持常量的变化。 一个弱点......由于变量命名约定,它不会涵盖所有可能的字符。

修改

感谢@Hopeless,感谢评论提高答案,避免不必要的虚拟课程

答案 3 :(得分:0)

在C#中,字符串是不可变的。要更改字符串的内容,您需要创建一个新字符串。

在您的情况下,您似乎正在用a_sub替换所有字符串的字符,因此您只需重复 n 次的a_sub字符, n 是原始字符串的长度:

string str = "This is a test";
const char a_sub = 'S';
str = new string(a_sub, str.Length);

修改:如果a_sub需要是字符串(不是字符),您可以使用:

string str = "This is a test";
const string a_sub = "S";
str = string.Concat(Enumerable.Repeat(a_sub, str.Length));

答案 4 :(得分:0)

        Dictionary<char, char> GetChar = new Dictionary<char, char>()
        {
            {'a','S'},
            {'b','Y'}

        };

        string str = "This is a test";

        string newStr = "";
        for (int i = 0; i < str.Length; i++)
        {
            newStr = newStr + GetChar[str[i]];
        }

我想这就是你想要的。使用字典是更好的主意,newStr将返回你想要的东西。

答案 5 :(得分:0)

看起来你想要像ROT13那样表现出一种奇怪,但是有一个非有序的字典(正如我所说的那样,因为你的翻译不按字母顺序排列)。

由于C#似乎缺少像Python这样的翻译函数

# ... Map a to d, b to e, and c to f.
dict = str.maketrans("abc", "def")
print(dict)

# Translate this value.
value = "aabbcc"
result = value.translate(dict)
print(result)

#Output: ddeeff

您必须使用字典而不是常量手动实现地图。

小心将翻译写入新变量而不是替换旧变量,因为您使用了一组无序键,因此可以在以后替换已经翻译过的字符(在你的例子首先用&#34; s&#34;以及&#34; s&#34;&#34; h&#34;)替换&#34; a&#34;&#34;&#34;)。

using System;
using System.Text;
using System.Collections.Generic;
public class Test
{

    public static void Main()
    {
        var d = new Dictionary<char, char> 
        {
            {'a', 'S'},
            {'b', 'Y'}, 
            {'c', 'X'}, 
            {'d', 'W'}, 
            {'e', 'V'},
            {'f', 'U'},
            {'g', 'T'},
            {'h', 'S'},
            {'i', 'R'},
            {'j', 'Q'},
            {'k', 'P'},
            {'l', 'O'},
            {'m', 'n'},
            {'n', 'M'},
            {'o', 'L'},
            {'p', 'K'},
            {'q', 'J'},
            {'r', 'I'},
            {'s', 'H'},
            {'t', 'G'},
            {'u', 'F'},
            {'v', 'E'},
            {'w', 'D'},
            {'x', 'C'},
            {'Y', 'B'},
            {'z', 'A'}
        };

        var input = "This is a test";

        var result = new StringBuilder("");
        foreach (var c in input.ToLower())
        {
            if (d.ContainsKey(c))
            {
                result.Append(d[c]);
            }
            else
            {
                result.Append(c);
            }
        }
        Console.WriteLine(result.ToString());
    }
}